C++ 프로그래밍에서 std::vector와 std::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::vector | std::array |
|---|---|---|
| 크기 | 동적 (런타임에 변경 가능) | 고정 (컴파일 타임에 결정) |
| 메모리 효율 | 오버헤드 존재 | 매우 효율적 |
| 요소 접근 속도 | 상대적으로 느림 | 항상 상수 시간 |
| 크기 변경 | 삽입/삭제 가능 | 불가능 |
정리하자면, 요소의 개수가 실행 도중에 변할 수 있는 경우에는 std::vector가 적합하고, 크기가 미리 정해져 있으며 최대 성능과 메모리 효율이 중요한 경우에는 std::array를 사용하는 것이 좋습니다. 두 컨테이너의 특성을 잘 이해하고 상황에 맞게 선택하면 더욱 효율적인 C++ 코드를 작성할 수 있습니다.