안녕하세요 삽잡이 입니다...
이번시간에는 vector의 동작원리를 이해할 수 있도록
기본적인... 낮은... 수준을 가진 저의 기준으로
vector의 기능들을 구현해본 코드를 소개하려고 합니다...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | #pragma once template <typename Element> class vector { Element* base; // 저장소 int ncapa; // 저장소 크기 int ncnt; // 보관 개수 public: class iterator { Element *pos; public: iterator(Element *pos = 0) // 기본 생성 { this->pos = pos; } int operator - (Element *pos) // Element 요소가 왔을 때 연산자 중복 정의 { return this->pos - pos; // 요소의 개수 파악 } bool operator!=(const iterator &iter) { return pos != iter.pos; } bool operator==(const iterator &iter) { return pos == iter.pos; } iterator &operator++() // 전위 증가 연산자 { pos++;//다음 위치로 이동 return (*this); } const iterator operator++(int) // 후위 증가 연산자 { iterator re(*this); pos++; // 다음 위치로 이동 return re; } Element operator *() // 간접 연산자 { return (*pos); // 해당 주소의 요소값 참조 } }; int capacity() const // 저장소의 크기 { return ncapa; } int size()const // 보관 개수 { ncnt; } // 생성자 vector() { base = 0; ncapa = 0; ncnt = 0; } //순차보관 -> 맨뒤에 보관 void push_back(Element data) { //특정 위치에 보관 insert insert(end(), data); } //iter 위치에 보관 void insert(iterator iter, Element data) { if(ncapa == ncnt) //꽉 차면 { // 연산자 중복 정의 필요 int index = iter - base; // 공간 재할당 if(ncapa = 0) // 현재 저장소의 크기가 0이면 { reserve(1);//저장소의 크기를 갱신 (저장소의 크기만 입력인자 길이만큼 늘려준다...) } else { reserve(ncapa*2); //저장소의 크기를 갱신 } } shiftright(index); // index뒤의 요소를 한 칸씩 오른쪽으로 이동 base[index] = data; ncnt++; } //iter 위치에 보관한 요소 지움 void erase(iterator iter) { int index = iter - base; // base로부터 상대적 거리 ncnt--; shiftleft(index); // index 뒤의 요소를 왼쪽으로 이동 } //저장소 (데이터 보관 되있는 시작 위치)시작 위치 반환 iterator begin() { iterator iter(base); return iter; } //가장 최근에 보관한 자료가 있는 다음 위치 반환 //이번에 보관할 위치 반환 iterator end() { iterator iter(base+ncnt); return iter; } //index 위치에 보관한 요소 자체를 반환 Element &operator[](int index) { if((index>=0)&&(index<ncapa)) { return base[index]; } throw "돌"; } //보관한 요소 개수를 n개로 갱신 //만약 현재 보관한 요소가 n보다 작으면 data로 채움 void resize(int n, Element data) { if(n > ncapa) { reserve(n); } for (int i = ncnt; i<n;i++) { base[i] = data; } } private: void shiftright(int index) { for( int n = ncnt; n>index; n--) { base[n] = base[n-1]; } } void reserve(int new_capa) { Element *temp = base; base = new Element[new_capa]; for(int i = 0; i<ncnt; i++) { base[i] = temp[i]; } if(temp) { delete[] temp; } // 저장소의 용량 변경한 값으로 교체 ncapa = new_capa; } void shiftleft(int index) { for( ; index<ncnt; index++) { base[index] = base[index+1]; } } }; | cs |
물론... 백날 이렇게 짜봤자...
우리는 vector를 구현해서 사용할 일이 없겠죠... 이미 잘 구현된 STL에 있으니 ㅎㅎ
하지만 이를 통해 vector 안 요소들의 기능들에 대한
이해를 할 수 있을 것 같습니다...
재미있군요....
오늘은 여기까지~!
이상 삽잡이였습니다!
'삽질의 현장 > - C++' 카테고리의 다른 글
#021_시(c)시(c)해서 C++?!_다시 한번 Command 패턴 사용하기 (0) | 2015.07.20 |
---|---|
#020_시(c)시(c)해서 C++?!_ 되돌아보자 씨쁠쁠 ... (0) | 2015.07.18 |
#018_시(c)시(c)해서 C++?!_STL_Vector 예제 (0) | 2015.07.15 |
#017_시(c)시(c)해서 C++?!_STL_Vector 맛보기 (0) | 2015.07.15 |
#016_시(c)시(c)해서 C++?!_Call Me Baby ~ 콜백... (커맨드 패턴) (0) | 2015.07.14 |