개발/C, C++

[C++] STL 컨테이너 Vector 의 용도와 특징, 사용 예제

growing-dev 2023. 9. 1. 22:32
반응형

C언어에서 C++언어로 오면서 특징 중에 하나가 컨테이너입니다. STL에서 제공하는 여러 가지의 컨테이너에 대해서 알아볼 텐데 오늘은 가장 중요하고 많이 사용되는 Vector에 대해서 알아보도록 하겠습니다.

 

 

STL 컨테이너 Vector 의 용도와 특징, 사용 예제

 

c++ 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을 방지할 수 있어서 더 좋습니다.

 




반응형