vector란
C++의 vector는 동적 배열(dynamic array)을 나타내는 STL 컨테이너입니다. 동적 배열은 배열과 유사하지만, 크기가 동적으로 조절될 수 있다는 점에서 차이가 있습니다.
vector의 특징
1. vector는 필요에 따라 확장, 축소될 수 있습니다.
- vector의 요소는 연속된 메모리에 저장됩니다.
- vector에 할당된 연속된 메모리 영역을 초과하여 요소들이 저장되어야 한다면(vector의 capacity를 초과한다면) 새로운 더 큰 메모리 영역이 할당되고 현재 요소들이 그곳으로 이동합니다.
- 크기가 동적으로 변할 필요가 없다면 array를 사용하는 것이 더 효율적입니다.
2. 상수 시간에 임의의 요소에 접근할 수 있습니다.
- 벡터는 배열과 마찬가지로 요소에 대한 직접적인 인덱스 접근이 가능합니다.
- v[0]의 형식으로 요소에 접근할 경우 경계 체크 X
- v.at(0)의 형식으로 요소에 접근할 경우 경계 체크 O(오류 메시지)
3. 상수 시간에 vector의 마지막 부분에 새로운 요소를 삽입, 삭제할 수 있습니다.
- push_back()을 이용하여 vector의 마지막 부분에 요소를 삽입할 수 있습니다.
- 메서드에 인자로 전달된 값이 복사되어 벡터의 끝에 추가됩니다.
- emplace_back()은 벡터의 끝에 요소를 직접 생성합니다.
- 임시 객체나 인자를 생성하는 데 필요한 복사 또는 이동 연산을 제거하고, 요소를 직접 생성하는데 사용될 수 있는 생성자 인자를 전달하여 성능을 향상시킬 수 있습니다.
- pop_back()을 이용하여 vector의 마지막 부분의 요소를 삭제할 수 있습니다.
- vector의 마지막이 아닌 부분에 삽입, 삭제 시 선형 시간이 걸리기 때문에 효율이 떨어집니다.
vector 활용 방법
// 초기화
std::vector<int> v1 {1, 2, 3, 4, 5};
std::vector<int> v2 (10, 100); // 10개의 요소를 100으로 초기화
// common method
std::cout << v1.size(); // 5
std::cout << v1.capacity(); // 5 -> vector의 현재 용량, 용량 초과 시 동적으로 확장된다.
std::cout << v1.max_size(); // 동적으로 확장될 수 있는 vector의 최대 크기, 매우 큰 값.
std::cout << v1[0]; // 1
std::cout << v1.at(0); // 1
std::cout << v1.front(); // 1
std::cout << v1.back(); // 5
v1.push_back(6); // v1 = {1, 2, 3, 4, 5, 6}
v1.pop_back(); // v1 = {1, 2, 3, 4, 5}
v1.emplace_back(6); // v1 = {1, 2, 3, 4, 5, 6}
std::cout << v1.empty(); // 0 (false)
v1.swap(v2); // v1과 v2를 swap
vector capacity
- vector의 capacity를 초과할 때마다 현재 capacity의 2배의 연속된 메모리 공간을 capacity로 새로 할당받게 됩니다.
- 예를 들어 만약 10000을 capacity로 갖는 vector에 10000개의 요소가 저장되어 있고 새로운 요소가 vector에 추가된다면, 새로 할당받는 vector의 capacity는 20000이 됩니다. (10000 -> 20000)
- 이 때, shrink_to_fit()메서드를 사용하여(C++11 이후) 정확히 vector의 size로 capacity를 줄일 수 있습니다. (20000 -> 10001)
- reserve()는 인자로 들어간 정수만큼 연속된 메모리 공간을 예약하는 메서드입니다.
v1.reserve(100);
std::cout << v1.capacity(); // 100
'자료구조 & 알고리즘' 카테고리의 다른 글
Binary Heap (0) | 2024.03.23 |
---|---|
비트마스크 (0) | 2024.02.19 |
Union-Find Structure (1) | 2024.02.14 |
세그먼트 트리(Segment Tree) (1) | 2024.01.15 |
다익스트라 알고리즘(Dijkstra's algorithm) (0) | 2024.01.13 |