본문 바로가기

BE/C++

[C++][STL] Vector 기본 사용법 및 예제 활용

인트로

안녕하세요! 오늘은 C++ STL중 하나인 벡터(Vector)의 기본 함수와 예제에 대해서 알아보도록 하겠습니다. 

벡터 기본함수는 push_back, pop_back, front, back, clear, begin, end, rbegin, rend, reverse 등이 있습니다.

목차
1) Vector란? 
2) Vector의 헤더파일
3) Vector의 생성 방법
4) Vector의 멤버 함수(접근, 삽입/삭제, 크기 등) 
5) for문, iterator로 접근하는 Vector6) Pair, Tuple 클래스와의 활용 

 

1. Vector란? 

Vector(Queue)은 동적 배열 구조를 C++로 구현한 것으로 맨 끝에서만 삽입 및 삭제가 일어나는 구조입니다. 

일반 배열과 차이점이라면 동적으로 크기가 변하고 메모리가 연속적이기 때문에

자동으로 배열의 크기를 조절할 수 있고 유연하게 객체의 추가 및 삭제가 가능하다는 점입니다. 

그러나 중간 데이터를 삭제하고 싶은 경우 Vector의 erase 함수를 통해 삭제할 수 있지만,

삭제가 빈번히 일어나는 경우 Vector 구조보다 링크드리스트를 쓰는 것이 효율적입니다. 

 

2. Vector의 헤더파일 

Vector STL을 사용하기 위해서는 #include <vector> 헤더파일을 포함해야 합니다 .

vector <데이터 타입> 이름 ; 으로 vector을 선언합니다. ex) vector <string> v; 

 

3. Vector의 선언 방법

벡터(Vector) 생성 방법에는 여러 가지가 있습니다.

1) Vector의 크기를 정하지 않은 경우 

vector<변수 타입> 이름; 

vector<int> v;

 

2) Vector의 크기를 정하는 경우 

vector<변수 타입> 이름(크기); 

아래 예제와 같이 기본값이 0인 사이즈 10인 벡터 v를 선언합니다.

vector<int> v(10);
vector<string> v2(5);

 

3) Vector의 크기를 정하고 데이터를 초기화할 경우 

vector<변수 타입> 이름(크기, 초기화 상수);

크기 10의 벡터에 1로 초기화하고 싶은 경우 아래의 방법과 같이 선언합니다. 

vector<int> v(10,1);

 

4. Vector 멤버 함수

다음으로 Vector의 멤버 함수에 대해 알아보겠습니다. 벡터는 아래와 같이 선언했다고 가정합니다. 

vector<int> v;

 

1. 원소 접근

1) v[idx] 

v[idx] 형태로 idx번째의 원소를 참조합니다. 

2) v.at(idx) 

벡터 v의 idx번째 원소를 참조합니다. 

3) v.front(), v.back() 

v.front() : Vector의 첫번째 원소를 참조합니다. 

v.back() : Vector의 마지막 원소를 참조합니다.

4) v.begin(), v.end() 

v.begin() : iterator로 접근 시 vector의 맨 첫번째 데이터 위치를 가리킵니다. 

v.end() : iterator로 접근 시 vector의 맨 마지막 데이터 위치의 다음을 가리킵니다. 

 

2. 삽입/ 삭제 

1) v.push_back(데이터); 

벡터 v의 데이터 타입에 맞는 데이터(정수, 문자열, 문자 등등) 를 맨 끝에 삽입합니다.

2) v.pop_back(); 

벡터 v의 맨 끝 데이터를 삭제합니다. 아래는 push_back, pop_back을 사용한 예제입니다. 

vector<int> v;
v.push_back(10);
v.push_back(20);
v.pop_back();

 

3) v.insert(데이터 위치, 데이터); 

벡터 v의 원하는 위치(2)에 데이터(3)를 삽입하고 싶은 경우 v.insert(2,3) 으로 선언합니다. 

vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.insert(2,40);

4) v.erase(iter)  

반복자인 iter을 통해 원소 위치에 접근하여 벡터 v의 데이터를 삭제합니다. 

v.begin() 위치의 데이터를 삭제하고 싶은 경우 아래와 같이 사용합니다. 

vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
auto iter = v.begin();
v.erase(iter);

 

3. 크기(사이즈) 함수

1) v.size()   : 현재 벡터 v의 원소 갯수(크기)를 리턴합니다. 

2) v.capacity() : 할당된 벡터의 원소 갯수(크기)를 리턴합니다. 

3) v.resize(n) , v.resize(n,10)

v.resize(n) : 벡터를 원래 크기에서 N 크기로 변경합니다.

v.resize(n,10) : 벡터를 크기 N으로 변경하며 데이터를 10으로 초기화합니다. 

4) v.empty() 
벡터 v가 비어있는 지 확인합니다. 현재 비어있는 경우 True 를 반환하고 비어있지 않을 경우 False를 리턴합니다. 

 

5. for문, iterator로 접근하는 Vector

다음으로 Vector의 멤버 함수에 대해 알아보겠습니다. 

1) for 문 : 인덱스 기반 원소 접근

다음과 같이 반복문을 선언하여 v[i] 형태로 원소를 접근할 수 있습니다.

vector<int> v;

v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);

for(int i=0;i<v.size();i++){
	cout << v[i] << endl;
}

 

출력 결과 

벡터에 데이터를 삽입한 순서대로 10 20 30 40 이 출력되는 모습을 볼 수 있습니다. 

10
20
30
40

 

2) Iterator 을 통한 원소 접근 

- 범위 기반 반복문을 통해 벡터 v 원소를 출력하기

- iterator 를 통해 v.begin() 부터 v.end() 까지 원소 출력하기 

vector<int> v;

v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);

for (auto iter : v) {
	cout << iter << endl;
}

for (auto iter = v.begin(); iter < v.end() ; iter++ ) {
	cout << *iter << endl;
}

출력 결과 

벡터에 데이터를 삽입한 순서대로 10 20 30 40 이 출력되는 모습을 볼 수 있습니다. 

10
20
30
40
10
20
30
40

 

3) 벡터가 비어있을 때까지 벡터 끝의 원소 출력 

vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
while (!v.empty()) {
	cout << v.back() << endl;
	v.pop_back();
}

출력 결과 

벡터에 데이터를 삽입한 순서와 반대로 40 30 20 10 이 출력되는 모습을 볼 수 있습니다. 

40
30
20
10

 

6. Pair/ Tuple 클래스와의 활용

1) Pair클래스 활용

Pair 클래스는 데이터를 쌍으로 저장하고자 할 때 유용한 클래스입니다. 

 

1)  Pair 클래스를 활용한 벡터 v 선언 

vector<pair<첫번째 원소 데이터 타입, 두번째 원소 데이터 타입>> v; 

 

2)  데이터 삽입

v.push_back(make_pair(첫번째 원소, 두번째 원소));

vector<pair<int,int>> v;
v.push_back(make_pair(10,20));

 

3) 데이터 접근

v[i].first : i번째 원소의 첫번째 인자 접근
v[i].first  : i번째 원소의 두번째 인자 접근

vector<pair<int,int>> v;
v.push_back(make_pair(10,20));

for(int i=0;i<v.size();i++)
	cout << v[i].first << " " << v[i].second << endl;

 

2) Tuple클래스 활용

Tuple 클래스는  Pair 클래스의 확장버전으로, 데이터를 세 개의 쌍(?)으로 저장하고자 할 때 유용한 클래스입니다. 

아래와 같이 헤더를 선언해야 합니다.

#include <tuple>

 

 

1) Tuple 클래스를 활용한 벡터 v 선언 

vector<tuple<1번째 원소 데이터 타입, 2번째 원소 데이터 타입, 3번째 원소 데이터 타입 >> v; 

 

2)  데이터 삽입

v.push_back(make_tuple(첫번째 원소, 두번째 원소, 세번째 원소));

vector<tuple<int,int,int>> v;
v.push_back(make_tuple(10,20,20));

 

 

3) 데이터 접근

get<0>(v[i])  : i번째 원소의 첫번째 인자 접근
get<1>(v[i])  : i번째 원소의 두번째 인자 접근

get<2>(v[i])  : i번째 원소의 두번째 인자 접근

vector<tuple<int,int,int>> v;
v.push_back(make_tuple(10,20,30));
v.push_back(make_tuple(40,50,60));

for(int i=0;i<v.size();i++)
	cout << get<0>(v[i]) << " " <<  get<1>(v[i]) << " " <<  get<2>(v[i]) << endl;

 

이상 C++의 Vector 클래스 기본 및 활용에 대한 정리 글을 마치겠습니다 :) 

문의 사항은 관련 댓글로 남겨주세요 :D