vector 만들기 소스 코드
//EHVector.h |
#pragma once namespace EHLIB { template<typename T> class vector { T *base; //요소를 보관할 저장소 size_t bsize; //보관된 요소 개수 size_t bcapacity; //저장소의 용량 public: class iterator { T *pos; //요소가 보관된 위치 public: iterator(T *pos=0) { this->pos = pos; } T operator *() { return *pos; //보관된 요소를 반환 } int operator-(const iterator &iter) { return pos - iter.pos ; } iterator &operator++() { pos++; return (*this); } const iterator operator++(int) { iterator re(*this); pos++; return re; } bool operator !=(const iterator &iter) { return pos == iter.pos; } bool operator ==(const iterator &iter) { return pos == iter.pos; } };
vector(size_t init_cnt=0,T t=0) { base = 0; bsize = 0; bcapacity = 0; reserve(init_cnt); //저장소의 용량을 init_cnt로 만들기 push_backs(init_cnt,t); //차례대로 t를 init_cnt개 보관 } ~vector() { if(base) //저장소가 할당되었을 때 { delete[] base; } } void push_backs(size_t cnt, T t) { for(size_t n=0; n<cnt; n++)//cnt개수의 t를 차례대로 보관 { push_back(t); } } void reserve(size_t ncapacity) { T *temp = new T[ncapacity]; //새로운 저장소를 할당 if(bsize) //보관된 요소가 있다면 { for(size_t n=0; n<bsize; n++) { temp[n] = base[n]; //기존 저장소에 보관된 요소를 새로운 저장소로 복사 } delete[] base; //기존 저장소를 소멸 } base=temp; //base에 새로운 저장소를 대입 bcapacity = ncapacity; //새로운 저장소 용량 대입 } void resize(size_t nsize) { if(nsize>bcapacity) //입력된 새로운 요소의 개수가 저장소보다 크다면 { reserve(nsize); //저장소 용량을 nsize로 늘려줌 } //새롭게 늘어난 요소 개수만큼 차례대로 0을 보관 for(size_t n=bsize; n<nsize ; n++) { insert(end(),0); } } void push_back(T t) { insert(end(),t); } void insert(iterator at, T t) { //at의 상대적 위치를 계산 size_t index = at - base;
//꽉 찼다면 용량을 늘려줌 if(bsize == bcapacity) { reserve(bcapacity+10); } //보관할 위치 뒤에 있는 요소들 뒤로 한 칸씩 이동 for(size_t n = bsize; n > index; n--) { base[n] = base[n-1]; } base[index] = t; bsize++; }
void erase(iterator at) { //at의 상대적 위치 계산 int index = at - base;
//삭제할 위치 뒤에 요소들 한 칸씩 앞으로 이동 for(size_t n = index+1; n < bsize; n++) { base[n-1] = base[n]; } bsize--; }
T &operator[] (size_t index) { if(index<bsize) { return base[index]; } throw "잘못된 인덱스를 사용하였습니다."; }
iterator begin() { return base; } iterator end() { //주위!!! 마지막 보관된 요소 위치가 아니라 그 다음 위치를 반환함 return base+bsize; } size_t size() { return bsize; } size_t capacity() { return bcapacity; } }; }; |
'언어 자료구조 알고리즘 > Escort 자료구조와 STL' 카테고리의 다른 글
[자료구조와 STL] 16. list 만들기 – 더미 노드있는 이중 연결 리스트 테스트 (0) | 2016.04.18 |
---|---|
[자료구조와 STL] 15. list 만들기 – 더미 노드있는 이중 연결 리스트 소스 코드 (0) | 2016.04.18 |
[자료구조와 STL] 14. list 만들기 – 더미 노드있는 이중 연결 리스트 (0) | 2016.04.18 |
[자료구조와 STL] 13. list (연결리스트) (0) | 2016.04.18 |
[자료구조와 STL] 12. find , find_if 만들어보기 (0) | 2016.04.18 |
[자료구조와 STL] 10. vector 만들기 (0) | 2016.04.18 |
[자료구조와 STL] 9.vector를 이용하여 특정 키 순으로 보관하기 예제 코드 (0) | 2016.04.18 |
[자료구조와 STL] 8. 3 vector를 이용하여 특정 키 순으로 보관하기 (0) | 2016.04.18 |
[자료구조와 STL] 7.vector에 자료를 차례대로 보관하기 예제 코드 (0) | 2016.04.18 |
[자료구조와 STL] 6.vector에 자료를 차례대로 보관하기 (0) | 2016.04.18 |