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

C++ std::vector와 std::array의 차이점 완벽 정리

C++ 프로그래밍에서 std::vectorstd::array는 모두 여러 개의 요소를 저장하는 대표적인 컨테이너입니다. 하지만 두 컨테이너는 동작 방식, 메모리 관리, 성능 측면에서 중요한 차이점을 가지고 있습니다. 이 글에서는 두 컨테이너의 차이를 자세히 살펴보고, 실제 예제 코드를 통해 그 사용법을 확인해 보겠습니다.

std::vector와 std::array의 주요 차이점

  • 벡터(vector)는 요소를 저장하는 순차 컨테이너이며, 인덱스 기반이 아닙니다.
  • 배열(array)은 동일한 타입의 요소들을 고정된 크기로 순차적으로 저장하며, 인덱스 기반으로 접근합니다.
  • 벡터는 동적인 특성을 가지고 있어 요소를 삽입할 때마다 크기가 자동으로 증가합니다.
  • 배열은 크기가 고정되어 있어 한 번 초기화하면 크기를 다시 조정할 수 없습니다.
  • 벡터는 내부적으로 추가 정보를 관리하기 때문에 상대적으로 더 많은 메모리를 차지합니다.
  • 배열은 불필요한 오버헤드가 없어 메모리 효율성이 뛰어난 자료구조입니다.
  • 벡터는 요소 접근에 더 많은 시간이 소요될 수 있습니다.
  • 배열은 요소들이 연속된 메모리 공간에 할당되어 있기 때문에 위치와 무관하게 항상 일정한 시간(상수 시간) 내에 요소에 접근할 수 있습니다.

선언 및 초기화 문법

벡터와 배열은 다음과 같은 문법으로 선언하고 초기화할 수 있습니다.

// 벡터 선언
vector<데이터타입> 벡터이름;

// 배열 선언
데이터타입 배열이름[배열크기];

// 벡터 초기화
vector<데이터타입> 벡터이름 = {값1, 값2, ...};

// 배열 초기화
데이터타입 배열이름[배열크기] = {값1, 값2, ...};

std::vector 예제 코드

아래 예제는 2차원 벡터를 선언하고 중첩 반복문을 사용해 모든 요소를 출력하는 코드입니다.

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<vector<int>>v{ { 4, 5, 3 }, { 2, 7, 6 }, { 3, 2, 1 ,10 } };
    cout<<"the 2D vector is:"<<endl;
    for (int i = 0; i < v.size(); i++) {
        for (int j = 0; j < v[i].size(); j++)
            cout << v[i][j] << " ";
            cout << endl;
    }
    return 0;
}

실행 결과

the 2D vector is:
4 5 3
2 7 6
3 2 1 10

위 출력에서 볼 수 있듯이, 각 행(내부 벡터)의 크기가 서로 달라도 벡터는 유연하게 처리할 수 있습니다. 마지막 행처럼 요소가 4개인 벡터도 문제없이 저장됩니다.

std::array 예제 코드

아래 예제는 std::array의 크기 확인, at() 함수를 이용한 요소 접근, fill() 함수를 이용한 값 채우기 기능을 보여줍니다.

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

int main() {
    array<int,4>a = {10, 20, 30, 40};
    cout << "The size of array is : ";
    // size() 함수로 배열의 크기 확인
    cout << a.size() << endl;
    // 배열이 담을 수 있는 최대 요소 개수
    cout << "Maximum number of elements array can hold is : ";
    cout << a.max_size() << endl;
    // at() 함수로 배열 요소 출력
    cout << "The array elements are (using at()) : ";
    for ( int i=0; i<4; i++)
        cout << a.at(i) << " ";
        cout << endl;
        // fill() 함수로 배열을 1로 채우기
        a.fill(1);
        // 채운 후 배열 출력
        cout << "Array after filling operation is : ";
    for ( int i=0; i<4; i++)
        cout << a[i] << " ";
        return 0;
}

실행 결과

The size of array is : 4
Maximum number of elements array can hold is : 4
The array elements are (using at()) : 10 20 30 40
Array after filling operation is : 1 1 1 1

std::array는 size(), max_size(), at(), fill() 등 STL 컨테이너 스타일의 멤버 함수를 제공하면서도, 일반 배열처럼 고정된 크기와 높은 성능을 유지합니다.

마무리: 어떤 것을 선택해야 할까?

구분std::vectorstd::array
크기동적 (런타임에 변경 가능)고정 (컴파일 타임에 결정)
메모리 효율오버헤드 존재매우 효율적
요소 접근 속도상대적으로 느림항상 상수 시간
크기 변경삽입/삭제 가능불가능

정리하자면, 요소의 개수가 실행 도중에 변할 수 있는 경우에는 std::vector가 적합하고, 크기가 미리 정해져 있으며 최대 성능과 메모리 효율이 중요한 경우에는 std::array를 사용하는 것이 좋습니다. 두 컨테이너의 특성을 잘 이해하고 상황에 맞게 선택하면 더욱 효율적인 C++ 코드를 작성할 수 있습니다.