C언어에서 C++언어로 오면서 특징 중에 하나가 컨테이너입니다. STL에서 제공하는 여러 가지의 컨테이너에 대해서 알아볼 텐데 오늘은 가장 중요하고 많이 사용되는 Vector에 대해서 알아보도록 하겠습니다.
STL 컨테이너 Vector 의 용도와 특징, 사용 예제
Vector란
Vector는 순차적인 데이터를 저장하고 관리하는 데 사용됩니다. 예를 들어, 배열처럼 연속적인 메모리 공간에 데이터를 저장하며, 데이터를 추가, 삭제, 수정하거나 검색하는 작업을 효율적으로 수행할 수 있습니다.
즉 전통적인 C스타일의 배열과 매칭되는 컨테이너입니다.
Vector의 특징
동적 크기 조절
Vector는 크기를 동적으로 조절할 수 있기 때문에 초기에 얼마나 많은 요소가 필요한지 미리 알 필요가 없습니다. 이로써 메모리 관리에 대한 부담이 줄어들며, 프로그램이 런타임 중에 데이터 크기를 자유롭게 조절할 수 있습니다.
일반적으로 배열의 경우 선언시점에 사이즈를 정해놓아야 해서 메모리 측면에서 비효율적인 경우가 있습니다. 벡터는 어느 정도 할당된 상태에서 다이내믹하게 필요할 때 추가할 수 있습니다.
내부 구조
Vector는 배열과 비슷한 내부 구조를 가지고 있으며, 데이터 요소는 연속된 메모리 위치에 저장됩니다. 이로 인해 데이터에 빠르게 접근할 수 있으며, 인덱스를 사용하여 요소에 접근합니다. 또한, 메모리 할당 및 해제는 자동으로 처리되므로 개발자가 직접 관리할 필요가 없습니다.
Vector 사용법
데이터 타입과 선언
Vector는 여러 데이터 타입을 저장할 수 있습니다. 예를 들어, 정수, 실수, 문자열, 사용자 정의 객체 등을 저장할 수 있습니다.
std::vector<int> intVector; // 정수형 요소를 저장하는 vector
std::vector<double> doubleVector; // 실수형 요소를 저장하는 vector
std::vector<std::string> strVector; // 문자열 요소를 저장하는 vector
요소 추가
Vector에 요소를 추가할 때, push_back() 함수를 사용합니다. 추가에 드는 시간복잡도는 이론적으로 O(1) 입니다.
하지만 힙에서 할당가능한 capacity를 초과하면 전체가 다른 위치로 옮겨가야 하므로 push back 도 O(n)이 될 수도 있습니다. 이를 보완하기 위해 vector.reserve(n)를 통해 어느 정도 공간을 미리 할당하는 것도 하나의 방법입니다.
intVector.push_back(42);
strVector.push_back("Hello");
요소를 추가하는 다른 방법으로 emplace_back() 이 있습니다. emplace_back과 push_back의 차이에 대해서는 조금 더 심화된 내용이므로 다른 포스팅에서 다루도록 하겠습니다.
요소 접근
Vector의 요소에 접근할 때, 인덱스를 사용합니다. 인덱스는 0부터 시작하며, at() 함수나 [] 연산자로 접근할 수 있습니다.
배열과 마찬가지로 인덱스로 바로 접근하므로 O(1) 시간만에 접근할 수 있습니다.
int value = intVector[0]; // 첫 번째 요소에 접근
double num = doubleVector.at(2); // 세 번째 요소에 접근
크기 확인
Vector의 크기는 size() 함수를 사용하여 확인할 수 있습니다.
int size = strVector.size();
요소 삭제
pop_back() 함수를 사용하여 Vector의 마지막 요소를 삭제할 수 있습니다.
intVector.pop_back();
범위 기반 반복
C++11부터는 범위 기반 for 루프를 사용하여 Vector를 쉽게 순회할 수 있습니다.
for (const auto& element : strVector) {
std::cout << element << std::endl;
}
결론
C++ Vector는 동적 배열을 효율적으로 다룰 수 있는 강력한 도구입니다. 크기를 동적으로 조절할 수 있고, 내부 구조가 배열과 유사하므로 데이터에 빠르게 접근할 수 있습니다. new/delete를 사용하는 것보다 vector를 활용하는 것이 메모리 leak을 방지할 수 있어서 더 좋습니다.
'개발 > C, C++' 카테고리의 다른 글
[C++] class 생성자에서 explicit 키워드의 의미 (0) | 2023.09.05 |
---|---|
[C++] STL 컨테이너 Set과 Map 활용법과 차이점 (0) | 2023.09.02 |
[C++] 생성자에서 virtual 가상 함수 호출하는 경우의 문제 (0) | 2023.08.11 |
[C++] 복사 생성자(Copy Constructor) 의 이해 및 활용 (1) | 2023.07.27 |
[C++] 참조자 (reference) 의 정의, 사용법 및 주의 사항 (0) | 2023.03.28 |