Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 벡터(Vector) 완벽 이해하기: 동작 원리와 주요 함수 활용법

벡터(Vector)는 C++ STL(표준 템플릿 라이브러리)이 제공하는 대표적인 시퀀스 컨테이너로, 동적 배열처럼 동작합니다. 요소가 삽입되거나 삭제되면 벡터가 스스로 크기를 자동으로 조절하며, 내부 저장 공간 역시 컨테이너가 알아서 관리해 줍니다.

벡터의 요소들은 메모리상에 연속적으로 배치되므로, 인덱스 연산자([])뿐 아니라 반복자(iterator)를 통해서도 빠르게 접근하고 순회할 수 있습니다. 데이터의 삽입과 삭제는 벡터의 시작 위치, 중간, 끝 어디에서든 가능하지만, 일반적으로는 끝에 요소를 추가하는 push_back()이 가장 효율적입니다.

아래는 벡터의 다양한 멤버 함수를 한눈에 익힐 수 있는 C++ 프로그램 예제입니다.

알고리즘

시작
    vector 타입의 변수 v를 선언한다.
    vector 타입의 반복자 it을 선언한다.
    정수형 변수 c와 i를 선언한다.
    while(1) 반복:
        메뉴를 출력한다. (크기 확인 / 요소 삽입 / 마지막 요소 삭제 /
        resize / reserve / 용량 출력 / 반복자 출력 / 비우기 / 종료)
        사용자로부터 선택 번호 c를 입력받는다.
        switch(c):
            case 1 : size() 함수로 벡터의 현재 크기를 출력한다.
            case 2 : 값을 입력받아 push_back()으로 벡터 끝에 삽입한다.
            case 3 : pop_back()으로 마지막 요소를 삭제한다.
            case 4 : resize() 함수로 벡터의 크기를 조정한다.
            case 5 : reserve() 함수로 벡터의 용량을 미리 확보한다.
            case 6 : capacity() 함수로 벡터의 용량을 출력한다.
            case 7 : begin()부터 end()까지 반복자로 전체 요소를 출력한다.
            case 8 : clear() 함수로 벡터의 모든 요소를 제거한다.
            case 9 : 프로그램을 종료한다.
            default : '잘못된 선택' 메시지를 출력한다.
종료

예제 코드

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v;
    vector<int>::iterator it;
    int c, i;

    while (1) {
        cout << "1.벡터 크기 확인" << endl;
        cout << "2.벡터에 요소 삽입" << endl;
        cout << "3.벡터의 마지막 요소 삭제" << endl;
        cout << "4.벡터 크기 조정(resize)" << endl;
        cout << "5.벡터 용량 예약(reserve)" << endl;
        cout << "6.벡터 용량(capacity) 출력" << endl;
        cout << "7.반복자로 전체 출력" << endl;
        cout << "8.벡터 비우기" << endl;
        cout << "9.종료" << endl;
        cout << "메뉴를 선택하세요: ";
        cin >> c;

        switch (c) {
            case 1:
                cout << "벡터 크기: " << v.size() << endl;
                break;
            case 2:
                cout << "삽입할 값을 입력하세요: ";
                cin >> i;
                v.push_back(i);
                break;
            case 3:
                cout << "마지막 요소를 삭제했습니다." << endl;
                v.pop_back();
                break;
            case 4:
                cout << "벡터 크기를 10으로 조정합니다." << endl;
                v.resize(10);
                break;
            case 5:
                cout << "벡터 용량을 100으로 예약합니다." << endl;
                v.reserve(100);
                break;
            case 6:
                cout << "벡터 용량(capacity): " << v.capacity() << endl;
                break;
            case 7:
                cout << "반복자로 출력한 벡터: ";
                for (it = v.begin(); it != v.end(); it++) {
                    cout << *it << " ";
                }
                cout << endl;
                break;
            case 8:
                v.clear();
                cout << "벡터가 비워졌습니다." << endl;
                break;
            case 9:
                exit(1);
            default:
                cout << "잘못된 선택입니다." << endl;
        }
    }
    return 0;
}

실행 결과

메뉴를 선택하세요: 1
벡터 크기: 0

메뉴를 선택하세요: 2
삽입할 값을 입력하세요: 1
... (같은 방식으로 값 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12를 차례대로 삽입)

메뉴를 선택하세요: 1
벡터 크기: 12

메뉴를 선택하세요: 7
반복자로 출력한 벡터: 1 3 2 4 5 6 7 8 9 10 11 12

메뉴를 선택하세요: 4      ← resize(10) 실행
메뉴를 선택하세요: 7
반복자로 출력한 벡터: 1 3 2 4 5 6 7 8 9 10

메뉴를 선택하세요: 3      ← 마지막 요소 삭제(pop_back)
메뉴를 선택하세요: 7
반복자로 출력한 벡터: 1 3 2 4 5 6 7 8 9

메뉴를 선택하세요: 8      ← clear()
벡터가 비워졌습니다.

메뉴를 선택하세요: 9      ← 프로그램 종료

size()와 capacity()의 차이

size()는 현재 실제로 저장된 요소의 개수를 반환하고, capacity()는 메모리를 다시 할당하지 않고도 저장할 수 있는 최대 요소 수를 반환합니다. 위 예제에서 요소를 계속 추가하면 size가 1씩 늘어나다가, capacity를 초과하는 시점에 벡터가 내부 버퍼를 더 큰 크기로 재할당하는 것을 확인할 수 있습니다.

resize()와 reserve()의 차이

resize(n)은 벡터의 실제 크기를 n개로 변경하며, 늘어난 만큼의 요소는 기본값(정수의 경우 0)으로 초기화됩니다. 반면 reserve(n)은 단순히 미리 메모리 용량만 확보할 뿐 요소 개수(size)에는 영향을 주지 않습니다. 대량의 데이터를 삽입하기 전에 reserve()로 용량을 확보해 두면 불필요한 재할당과 복사 비용을 줄여 성능을 향상시킬 수 있습니다.

주요 멤버 함수 한눈에 보기

  • size() : 현재 저장된 요소의 개수를 반환합니다.
  • push_back(x) : 벡터 맨 뒤에 요소 x를 추가합니다. (평균 O(1))
  • pop_back() : 마지막 요소를 제거합니다.
  • resize(n) : 크기를 n으로 변경하며, 증가분은 기본값으로 초기화됩니다.
  • reserve(n) : 용량을 n 이상으로 미리 확보합니다.
  • capacity() : 재할당 없이 담을 수 있는 최대 요소 수를 반환합니다.
  • begin() / end() : 각각 첫 번째 요소와 마지막 요소의 다음 위치를 가리키는 반복자를 반환합니다.
  • clear() : 모든 요소를 제거합니다. (용량은 유지됩니다.)

이처럼 벡터는 자동 메모리 관리, 연속된 메모리 배치, 반복자 기반 순회라는 장점 덕분에 C++에서 가장 널리 사용되는 컨테이너입니다. 위 예제를 직접 실행해 보며 각 함수의 동작을 확인해 보세요.