인트로
안녕하세요! 오늘은 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
'BE > C++' 카테고리의 다른 글
[C++][STL] Queue 기본 사용법 및 예제 (2) | 2020.11.04 |
---|---|
[C++] 날짜를 초로 변환 (date to seconds) (0) | 2020.11.03 |
[C++][STL] Stack 기본 사용법 및 예제 (3) | 2020.11.03 |
[C++] 이차원 배열 동적할당하기 (0) | 2020.11.02 |
[C++] stringstream 사용법 (0) | 2020.10.30 |