동적배열로 구현된 컨테이너다.
뒤에서부터 삽입, 삭제가 가능하다. 앞쪽에서의 삽입, 삭제는 못한다.
따라서 뒤쪽이 열려있다고 할 수 있다.
중간 삽입 (insert)
vector.insert(이터레이터 위치, 값);
이런식으로 사용한다. 이터레이터 위치는 iter.begin() + 3 처럼 쓴다. 즉, 4번째 원소이자 arr[3],
iter_begin[3] 과 같은 의미
*주의사항
벡터는 동적배열이므로 그 크기가 바뀐다.
만약 이터레이터의 위치 값을 변수에 담아두고 사용했을때
vector<int>::iterator iter_begin = vecInt.begin();
vector<int>::iterator iter_end = vecInt.end();
begin과 end가 유효하지 않은 위치가 될 수 있다.
왜냐하면 이터레이터는 내부적으로 capacity보다 많은 원소를 담기 위해서는 더 큰 배열을 새로 생성해서
기존의 배열을 삭제하고 그 배열을 취하는 형태로 동작하는데, 이때 변수에 담아둔 begin과 end는
기존의 배열의 위치를 가리키므로 dagling pointer처럼 이상한 위치를 가리키게 되는 것이다.
따라서 이때는 새로 생성된 배열의 begin과 end로 변수를 갱신해줘야한다.
iter_begin = vecInt.begin();
iter_end = vecInt.end();
중간삭제 (erase)
vector<int>::iterator iter_begin = vecInt.begin();
vector<int>::iterator iter_end = vecInt.end();
vecInt.erase(iter_begin);
for (; iter_begin != vecInt.end(); ++iter_begin)
cout << *iter_begin << endl;
이러면 터진다. 왜냐하면 iter_begin 위치에 있는 원소가 삭제되었고, for문에서는 그 위치에
접근하고 있기 때문이다. 이처럼 무효화된 위치에 접근 시도가 있으면 바로 에러가 발생한다.
해결법은
// 현재 바라보고 있는 위치의 원소를 삭제한 후 다음 위치의 반복자를 반환한다.
iter_begin = vecInt.erase(iter_begin);
이런식으로 erase의 반환값을 사용하는 것이다. 삭제된 원소의 위치가 아니라,
다음 위치의 반복자를 반환하기 때문에 유효한 위치가 된다.
vector 메모리 예약
vector는 capacity를 넘는 원소 삽입요청이 있을 때 내부적으로
현재 capacity /2 만큼 더한 배열을 새로 만들어 그것을 취한다.
만약 size와 capacity가 100이고, 여기서 원소를 하나 더 추가했을때 capacity는 150이 된다.
하지만 사용자는 101번째까지만 필요하다 한다면 나머지 49개의 배열방은 낭비되는 것이다.
이때는 메모리 예약을 통해 101개의 배열방을 미리 잡아두면 된다.
1. 생성자를 통한 메모리 확보
vector<int> vecInt(5);
이런식으로 하면 5개의 배열방을 가진 벡터가 생성된다.
주의할 점은 모든 원소가 0으로 초기화되므로 push_back을 했을때 첫번째가 아닌
6번째 원소에 삽입된다는 것이다.
따라서 clear()로 원소를 비워준 뒤에 push_back을 하거나 resize(0)으로
사이즈를 0으로 줄여준 뒤에 삽입해야한다. 어느 방식이건 똑같다.
2. reserve
이런 과정이 귀찮기때문에 reserve를 사용한다.
reserve를 사용하면 확보한 공간이 0으로 채워지지 않고, size도 0이다.
capacity만 reserve로 설정한만큼 확보되는 것이다.
vector<int> vecInt;
vecInt.reserve(5);
cout << "vecInt.size: " << vecInt.size() << endl; //0
cout << "vecInt.capa: " << vecInt.capacity() << endl; //5
'C++' 카테고리의 다른 글
STL - list (0) | 2020.10.27 |
---|---|
STL - iterator (0) | 2020.10.27 |
STL (0) | 2020.10.27 |
탬플릿 (0) | 2020.10.27 |
인라인함수, 매크로함수 (0) | 2020.10.27 |