벡터 (STL)

정의
벡터는 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. 용량 전략: 대부분의 구현은 새 용량을 기존 용량의 1.5~2배 정도로 확장한다. 이는 재할당 횟수를 최소화하면서 메모리 낭비를 제한한다.
  2. 메모리 할당자: 템플릿 매개변수 Allocator를 통해 사용자 정의 할당자를 지정할 수 있다(std::vector<T, Allocator>).
  3. 예외 안전: 삽입·확장 연산은 강력한 예외 안전(Strong guarantee)을 제공한다. 재할당 중에 복사/이동이 실패하면 원본 벡터는 변하지 않는다.

표준 정의

  • 최초 도입: C++98 표준 라이브러리 <vector> 헤더에 포함.
  • 최신 개정: C++11에서 emplace_back, 이동 의미론, constexpr 지원 등이 추가되었으며, C++20에서는 span과의 상호 운용성을 위한 data() 반환값이 constexpr이 되었다.

참고 문헌

  1. ISO/IEC 14882:2020 – Programming Language C++, §23.3.11 (vector).
  2. Nicolai M. Josuttis, The C++ Standard Library – A Tutorial and Reference, 2nd ed., Addison‑Wesley, 2012.
  3. cppreference.com – std::vector 페이지 (https://en.cppreference.com/w/cpp/container/vector).

벡터는 높은 성능과 사용 편의성을 동시에 제공하는 C++ 표준 컨테이너 중 핵심 요소이며, 대부분의 실용적 프로그램에서 동적 배열이 필요할 때 기본 선택지로 활용된다.

둘러보기

더 찾아볼 만한 주제