C++의 std::vector는 실행 중에 크기를 변경할 수 있는 동적 배열 컨테이너다.
메모리의 연속된 공간을 점유하여 인덱스를 통한 임의 접근(O(1))이 가능하며, 끝부분에서의 데이터 삽입 및 삭제가 효율적이다.
선언 및 초기화
vector는 다양한 방식으로 선언하고 초기화할 수 있다.
#include <iostream>
#include <vector>
int main() {
// 빈 벡터 선언
std::vector<int> v1;
// 크기 5를 0으로 초기화
std::vector<int> v2(5);
// 크기 5를 10으로 초기화
std::vector<int> v3(5, 10);
// 초기화 리스트 사용 (C++11 이상)
std::vector<int> v4 = {1, 2, 3, 4, 5};
return 0;
}
데이터 삽입 및 삭제
push_back()과 pop_back()을 사용하여 끝부분의 데이터를 관리한다.
std::vector<int> vec;
// 데이터 삽입
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
// 데이터 삭제 (마지막 요소 제거)
vec.pop_back();
// 특정 위치에 삽입 (비용 발생: O(N))
vec.insert(vec.begin() + 1, 15);
// 특정 위치 삭제 (비용 발생: O(N))
vec.erase(vec.begin());
데이터 접근 및 순회
인덱스 연산자([])나 at() 함수를 사용하여 데이터에 접근한다.
// 인덱스 접근
std::cout << vec[0] << std::endl;
// at() 접근 (범위 검사 포함)
try {
std::cout << vec.at(10) << std::endl;
} catch (const std::out_of_range& e) {
std::cerr << "Out of range error" << std::endl;
}
// 범위 기반 for 루프 순회
for (int val : vec) {
std::cout << val << " ";
}
// 반복자(Iterator) 순회
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
크기(Size)와 용량(Capacity)
vector는 실제 데이터 개수인 size와 메모리에 할당된 공간인 capacity를 구분하여 관리한다.
std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
// 메모리 예약 (불필요한 재할당 방지)
vec.reserve(100);
// 모든 요소 제거
vec.clear();
P.S
std::vector는 데이터의 순차적 저장과 빠른 접근이 필요할 때 가장 우선적으로 고려되는 컨테이너다.
중간 삽입/삭제가 빈번한 경우라면 std::list나 std::deque를 대안으로 검토해야 하는 것 같다.