C++ vector 컨테이너 정리

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::liststd::deque를 대안으로 검토해야 하는 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts