push_back vs emplace_back

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++에서 가장 널리 사용되는 컨테이너 중 하나로, 대부분의 상황에서 배열 대신 사용하기에 적합합니다.

C++ Vector 메서드 참조표

1. 생성자 및 소멸자

메서드 설명 예제
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);