정의
벡터는 C++ 표준 템플릿 라이브러리(Standard Template Library, STL)에서 제공하는 동적 배열 컨테이너이다. std::vector<T> 형태로 템플릿 매개변수 T에 지정된 타입의 원소들을 연속적인 메모리 영역에 저장하며, 필요에 따라 자동으로 용량을 확대·축소한다. 벡터는 배열과 유사한 인덱스 기반 접근을 지원하면서도, 삽입·삭제 연산 및 메모리 관리에 대한 편의성을 제공한다.
주요 특징
| 특징 | 설명 |
|---|---|
| 연속 메모리 | 원소가 연속된 메모리 블록에 저장되므로 포인터 연산 및 memcpy와 같은 저수준 함수와 호환된다. |
| 동적 크기 | push_back, emplace_back 등으로 원소를 추가하면 자동으로 용량(capacity)이 증가한다. |
| 임의 접근 | operator[], at()를 통해 상수·비상수 시간(O(1))에 원소에 접근 가능. |
| 삽입·삭제 | 끝(Back)에서의 삽입·삭제는 평균 O(1)이며, 중간 위치에서의 삽입·삭제는 O(n)이다. |
| 예외 안전 | at()은 범위 초과 시 std::out_of_range 예외를 발생시킨다. |
| 메모리 관리 | reserve, shrink_to_fit 등을 이용해 용량을 미리 예약하거나 축소할 수 있다. |
| 스레드 안전 | 개별 객체에 대해 동시 읽기는 안전하지만, 쓰기·읽기 동시 연산은 사용자에게 책임이 있다. |
주요 멤버 함수
| 함수 | 설명 |
|---|---|
size() |
현재 저장된 원소 개수를 반환한다. |
capacity() |
현재 할당된 메모리 용량(원소 수)를 반환한다. |
empty() |
size() == 0인지를 검사한다. |
push_back(const T& value) / push_back(T&& value) |
벡터 끝에 원소를 복사·이동 삽입한다. |
emplace_back(Args&&... args) |
원소를 직접 구성하여 삽입한다. |
pop_back() |
마지막 원소를 제거한다. |
insert(iterator pos, const T& value) |
지정 위치에 원소를 삽입한다. |
erase(iterator pos) |
지정 위치의 원소를 삭제한다. |
clear() |
모든 원소를 제거한다(용량은 유지된다). |
resize(size_type n, const T& value = T()) |
크기를 n으로 조정한다. 필요 시 새 원소를 value로 초기화한다. |
reserve(size_type n) |
최소 n개의 용량을 미리 할당한다. |
shrink_to_fit() |
가능한 경우 용량을 현재 크기에 맞게 축소한다. |
operator[](size_type i) |
범위 검사를 하지 않고 i번째 원소에 접근한다. |
at(size_type i) |
범위 검사를 수행하고, 초과 시 std::out_of_range 예외를 던진다. |
data() |
내부 연속 배열에 대한 포인터를 반환한다. |
begin(), end() |
순방향 반복자를 반환한다. |
rbegin(), rend() |
역방향 반복자를 반환한다. |
복잡도 요약
| 연산 | 평균 시간 복잡도 | 최악 시간 복잡도 |
|---|---|---|
operator[], at, front, back |
O(1) | O(1) |
push_back (용량 부족 시) |
Amortized O(1) | O(n) (재할당 및 복사) |
pop_back |
O(1) | O(1) |
insert (중간) |
O(n) | O(n) |
erase (중간) |
O(n) | O(n) |
reserve |
O(n) (재할당 시) | O(n) |
clear |
O(n) (소멸자 호출) | O(n) |
사용 예시
#include <vector>
#include <iostream>
int main() {
// 정수형 벡터 선언 및 초기화
std::vector<int> v = {1, 2, 3, 4, 5};
// 원소 추가
v.push_back(6);
v.emplace_back(7);
// 인덱스 접근
for (std::size_t i = 0; i < v.size(); ++i) {
std::cout << v[i] << ' ';
}
std::cout << '
';
// 중간 삽입
v.insert(v.begin() + 2, 99); // 99를 세 번째 위치에 삽입
// 삭제
v.erase(v.begin() + 4); // 다섯 번째 위치 원소 삭제
// 전체 출력 (범위 기반 for문)
for (int x : v) {
std::cout << x << ' ';
}
std::cout << '
';
// 용량 관리
v.shrink_to_fit(); // 필요 시 메모리를 축소
return 0;
}
관련 컨테이너
std::array<T, N>: 고정 크기 배열, 컴파일 타임에 크기가 결정된다.std::deque<T>: 양쪽 끝에서 빠른 삽입·삭제가 가능한 이중 끝 큐.std::list<T>: 양방향 연결 리스트, 중간 삽입·삭제가 O(1)이나 임의 접근이 불가능.std::forward_list<T>: 단일 연결 리스트, 메모리 오버헤드가 가장 적음.
구현 세부 사항
- 용량 전략: 대부분의 구현은 새 용량을 기존 용량의 1.5~2배 정도로 확장한다. 이는 재할당 횟수를 최소화하면서 메모리 낭비를 제한한다.
- 메모리 할당자: 템플릿 매개변수
Allocator를 통해 사용자 정의 할당자를 지정할 수 있다(std::vector<T, Allocator>). - 예외 안전: 삽입·확장 연산은 강력한 예외 안전(Strong guarantee)을 제공한다. 재할당 중에 복사/이동이 실패하면 원본 벡터는 변하지 않는다.
표준 정의
- 최초 도입: C++98 표준 라이브러리
<vector>헤더에 포함. - 최신 개정: C++11에서
emplace_back, 이동 의미론,constexpr지원 등이 추가되었으며, C++20에서는span과의 상호 운용성을 위한data()반환값이constexpr이 되었다.
참고 문헌
- ISO/IEC 14882:2020 – Programming Language C++, §23.3.11 (vector).
- Nicolai M. Josuttis, The C++ Standard Library – A Tutorial and Reference, 2nd ed., Addison‑Wesley, 2012.
- cppreference.com –
std::vector페이지 (https://en.cppreference.com/w/cpp/container/vector).
벡터는 높은 성능과 사용 편의성을 동시에 제공하는 C++ 표준 컨테이너 중 핵심 요소이며, 대부분의 실용적 프로그램에서 동적 배열이 필요할 때 기본 선택지로 활용된다.