1, 2, 3, 4 를 저장한 v라는 이름의 STL 벡터가 있다고 가정했을 때, 이 벡터는 메모리 상에서 다음과 같은 구조를 가진다.

여기서 중요한 점은 다음과 같다.
1)
벡터는 정보를 메모리 상에서 연결된 형태로 일렬로 저장한다.
때문에 벡터는 Random Access의 Time Complexity가 O(1)이다.
또 이 일렬로 순서대로 저장한다는 점 때문에, 벡터에서 n번째 위치에 요소를 추가/제거하려면 O(n)이 소요된다.
2)
벡터가 차지하는 공간(capacity)과 그 속에 저장되어있는 요소의 갯수(size)는 다르다.
벡터의 요소의 갯수(size)가 벡터가 보유한 공간(capacity)을 넘어서면 메모리의 다른 공간으로 요소 전체를 복사시키고, 원본은 삭제한다. 이 과정을 reallocation이라고 한다.
이러한 reallocation을 방지하려면, 벡터에 reserve()를 사용해 충분한 공간을 미리 할당시켜주면 된다.
이 부분에서 짚고 넘어가야 할 점이 몇 가지 있다.
1. 클래스를 담고 있는 벡터의 경우, 이러한 reallocation의 과정에서 클래스의 복사 생성자가 호출된다.

이때 복사 생성자 대신 이동생성자를 호출하도록 강제할 수 있는데, obj1의 복사 생성자에 noexcept 키워드를 추가해주면 된다.
2. 벡터가 reallocation을 할 때 새로운 capacity의 크기는 일반적으로 이전 크기의 두 배만큼 커진다. 즉 capacity = 4인 벡터에 원소를 5개 추가해서 reallocation이 일어나면 capacity가 8로 커진다.
3. 벡터에 클래스 형식의 요소를 추가할 때 push_back()을 사용하면 복사(C++11 이상부터는 이동)를 통해 요소를 전달한다. 때문에 push_back()보다는 emplace_back()을 통해 생성자를 넘겨주는 방식이 권장된다.
ex.
vector<int> v에 Coordinate 클래스의 인스턴스 z를 추가해야할 경우
Coordinate z(0, 0);
v.push_back(z);
를 하는 것보다
v.emplace_back(0, 0)
을 하는게 낫다.
(물론 이게 안되는 경우에는 어쩔 수 없이 push_back()을 사용해야 하긴 한다.)
c++STL vector<> 에 추가할때 클래스 소멸질문입니다. | KLDP
실험(?)을 위해 Integer클래스를 만들었습니다. class Integer { int n; public : Integer(int _n = 0): n(_n){} ~Integer() { cout << "del : " << n << endl; } operator int () const{ return n; } }; 소멸할때마다 n을 외치고 죽습니다. 그
kldp.org
'lang > c++' 카테고리의 다른 글
std::set의 iteration (0) | 2021.03.30 |
---|---|
동적 바인딩 혹은 늦은 바인딩이란(Dynamic binding) (0) | 2021.01.01 |
Virtual 키워드의 세부적인 작동 원리 - 함수 포인터와 Vtable (0) | 2021.01.01 |
STL Set의 메모리 구조 (0) | 2020.12.22 |
STL Vector에 클래스를 저장할 때 발생하는 일들 (0) | 2020.12.22 |