본문 바로가기
카테고리 없음

벡터에대하여

by ByteBridge 2013. 3. 12.
반응형


출처: http://cafe.naver.com/cafec

생성/소멸

vector<Elem> c               원소 없이 빈 vector 생성

vector<Elem> c1(c2)        같은 타입의 다른 vector를 복사하여 생성(모든 원소 복사)

vector<Elem> c(n)           디폴트 생성자에 의해서 생성되는 n개의 원소와 vector 생성

vector<Elem> c(n,elem)   elem원소의 n개의 복사본으로 vector를 초기화하여 생성

vector<Elem> c(beg.end) [beg,end)범위의 원소로 vector를 초기화하여 생성

c.~vector<Elem>()           모든 원소들을 파괴하고 메모리를 해제

 

이외 내부 함수가 여러가지 있습니다.

c.size()                          실제 원소 개수

c.empty()                       컨테이너가 비어 있는지 판단.

c.max_size()                  컨테이너가 가질 수 있는 최대 원소 개수

capacity()                       재할당 없이 가질 수 있는 원소 개수

reserve()                        용량을 증가

 

비교 연산자는 == , != , < , > , <= , >= 를 사용할 수 있고 컨테이너간 비교를 합니다.

 

vector와 deque의 경우 random access가 가능하므로 [] 를 사용할 수 있습니다.

c[idx]                            인덱스가 idx인 원소를 반환한다.

c.front()                          첫번째 원소 반환

c.back()                         마지막 원소 반환

 

반복자는

c.begin()                        첫번째 원소를 가르키는 random access iterator를 반환

c.end()                           마지막 원소 뒤를 가르키는 random access iterator를 반환

c.rbegin()                       역방향에서 첫번째 원소의 가르키는 역방향 iterator를 반환

c.rend()                          역방향에서 마지막 원소 뒤를 가르키는 역방향 iterator를 반환

 

원소 삽입 제거

c.insert(pos,elem)           반복자 pos위치에 elem의 복사본 삽입

c.insert(pos,n,elem)        elem의 n 개의 복사본을 반복자 pos 위치에 삽입

c.insert(pos,beg,end)       [beg,end) 범위의 모든 원소들을 복사하여 pos위치에 삽입

c.push_back(elem)          끝부분에 elem 복사본 추가

c.pop_back()                   마지막 원소 제거

c.erase(pos)                   반복자 pos 위치의 원소를 제거, 다음 원소의 위치 반환

c.erase(beg,end)             [beg,end) 범위의 모든 원소를 제거, 다음 원소의 위치 반환

c.resize(num)                 원소의 개수를 num개로 변경

c.resize(num,elem)         원소의 개수를 num개로 변경(증가의 경우 새 원소는 elem의 복사본)

c.clear()                         모든 원소들을 제거

 

- c++ standard library  참고-

 

실제 STL의 경우 부정적인 시각으로 보는 사람들이 많이 있습니다. 바로 사이즈를 처음 부터 많이 잡는다는 것이고 class 상속이 까다롭다는 것인데요. 그를 해결할 수 있는 방법은 effective STL에서도 제시한 바와 같이 사이즈는 resize를 사용하여 최적화된 크기를 유지 할 수 있고, 상속은 template type 형태만 잘 맞춰 주면 그다지 문제는 없습니다. 하지만 mfc에서는 좀 문제가 많은 것을 알고 있습니다만 여러가지 해법은 많이 제시 되고 있습니다.

 

 컨테이너는 특성상 자료를 가지고 있지 않더라도 미리 어느정도의 메모리 공간을 차지하고 있으며 자료가 그 영역내에 가득차기 전까지는 다시 할당하지 않습니다. 그리고, vector의 경우 random access를 최적화한 것이기 때문에 어디 위치의 자료라도 찾는데는 동일한 시간이 걸립니다. 하지만 erase를 중간에서 해버리거나 아무 위치에 자료를 넣게 되면 모든 메모리를 제 할당하여야 하기 때문에 효율이 많이 떨어 집니다. 뒤쪽에 추가하는 것은 아무런 문제가 되지 않습니다. 하지만 처음 잡혀진 영역 (capacity()로 확인 할 수 있습니다)에 차면 또다시 두배~네배 정도의 여유공간은 임의로 할당합니다. 이러한 작업은 allocater가 처리 하도록 되어 있습니다.

반응형