C++의 vector
는 표준 템플릿 라이브러리(STL)에서 제공하는 동적 배열 컨테이너입니다. 가변 크기의 배열을 구현한 것으로, 런타임에 크기를 자유롭게 조정할 수 있습니다.
동적 크기 조정: 컴파일 타임에 크기를 정할 필요가 없으며, 실행 중에 원소를 추가하거나 제거할 수 있습니다. 내부적으로 메모리 재할당을 통해 크기를 관리합니다.
연속된 메모리: 원소들이 메모리상에 연속적으로 저장되어 캐시 효율성이 좋고, 포인터 연산이 가능합니다. 이는 일반 배열과 동일한 성능을 제공합니다.
랜덤 액세스: 인덱스를 통해 O(1) 시간에 임의의 원소에 접근할 수 있습니다.
#include <vector>
#include <iostream>
int main() {
// 선언 및 초기화
std::vector<int> v1; // 빈 벡터
std::vector<int> v2(5); // 크기 5, 기본값 0으로 초기화
std::vector<int> v3(5, 10); // 크기 5, 모든 원소를 10으로 초기화
std::vector<int> v4{1, 2, 3, 4, 5}; // 초기화 리스트 사용
// 원소 추가
v1.push_back(10);
v1.push_back(20);
// 원소 접근
std::cout << v1[0] << std::endl; // 인덱스 접근
std::cout << v1.at(1) << std::endl; // 안전한 접근 (범위 검사)
return 0;
}
크기 관련: size()
는 현재 원소 개수를, capacity()
는 재할당 없이 저장할 수 있는 최대 원소 수를 반환합니다. empty()
로 비어있는지 확인할 수 있습니다.
원소 추가/제거: push_back()
으로 끝에 원소를 추가하고, pop_back()
으로 마지막 원소를 제거합니다. insert()
와 erase()
로 특정 위치에 삽입하거나 삭제할 수 있습니다.
접근: front()
와 back()
으로 첫 번째와 마지막 원소에 접근하고, data()
로 내부 배열의 포인터를 얻을 수 있습니다.
끝에서의 삽입/삭제는 평균 O(1) 시간이지만, 메모리 재할당이 발생하면 O(n)이 될 수 있습니다. 중간 위치에서의 삽입/삭제는 원소들을 이동해야 하므로 O(n) 시간이 걸립니다.
reserve()
함수를 사용해 미리 메모리를 할당하면 재할당 오버헤드를 줄일 수 있습니다. 이는 예상되는 크기를 알고 있을 때 성능 최적화에 유용합니다.
vector는 C++에서 가장 널리 사용되는 컨테이너 중 하나로, 대부분의 상황에서 배열 대신 사용하기에 적합합니다.
메서드 | 설명 | 예제 |
---|---|---|
vector() |
빈 벡터 생성 | vector<int> v; |
vector(size_t n) |
n개의 기본값으로 초기화 | vector<int> v(5); |
vector(size_t n, const T& val) |
n개의 val 값으로 초기화 | vector<int> v(5, 10); |
vector(initializer_list<T>) |
초기화 리스트로 생성 | vector<int> v{1,2,3}; |
vector(const vector& other) |
복사 생성자 | vector<int> v2(v1); |