vector container란?
vector는 C++에서 자주 사용하는 STL의 연속 컨테이너이다.
그럼 vector는 무엇일까?
간단하게 말하면 vector는 자동으로 메모리가 할당되는 배열이다.
배열처럼 쓰지만 array처럼 최대 크기가 정해져 있는 것이 아닌, 필요에 따라 유동적으로 확장되는 배열이다.
가능한 최대 경우에 맞추어 크기를 할당해야 하는 배열에 비해 메모리를 효율적으로 쓸 수 있다.
모든 STL 컨테이너가 그렇듯 템플릿이기 때문에 '모든' 형식으로 데이터를 넣을 수 있다. 예를 들어 int, float, char 등의 타입은 당연하고, struct까지 가능하다.
이제 vector container의 구조를 알아보자.
vector container 구조
기본적으로 배열과 비슷한 형태이다. C에서는 포인터로 배열의 값에 접근 및 수정을 할 수 있지만, vector는 iterator라는 것을 사용한다.
STL의 컨테이너인 만큼 제공하는 함수가 많고, 유용하다.
vector 선언
GNU 컴파일러를 사용한다면 <bits/stdc++.h> 헤더파일이 있으므로 편리하다.
만약 Clang 컴파일러를 사용하거나 vector 헤더파일을 직접 추가하고 싶다면 <vector> 헤더파일을 추가하면 된다.
STL vector는 namespace std에 있기 때문에 헤더파일 추가부분 아래에 using namespace std; 를 추가해주면 편하다.
만약 이 코드가 없다면 벡터 선언, cin cout 등에서 앞에 std::를 붙여주어야 한다.
이제 vector를 선언해보자. 편의를 위해 예제 코드의 vector 데이터 타입은 int로 통일하겠다.
#include <vector>
using namespace std;
int main(){
vector <int> v;
}
int형 vector v를 선언했다.
일반적인 형태는 vector <데이터 타입> 변수이름; 이다.
변수를 선언할 때 int a; 또는 int a = 10; 또는 int a, b = 20; 처럼 다양한 방법으로 선언할 수 있듯이, vector도 생성하는 방법이 다양하다.
- vector <int> v;
비어있는 vector v 생성. - vector <int> v(10);
0으로 초기화된 길이 10의 vector v 생성. - vector <int> v(10, -1);
-1로 초기화된 길이 10의 vector v 생성. - vector <int> vCopy(v);
v를 복사한 vCopy vector 생성.
vector의 멤버함수
STL vector는 지원하는 멤버함수가 매우 많고, 유용하다.
- v[idx];
v의 idx번째 위치의 데이터 참조. 배열과 비슷한 사용. - v.at(idx);
v의 idx번째 위치의 데이터 참조. v[idx]; 보다 느린 방법이지만, 범위 초과를 방지하는 점검을 거침. - v.front();
v의 첫 번째 데이터를 참조. - v.back();
v의 마지막 데이터를 참조. - v.begin();
첫 번째 데이터를 가리킴. 포인터와 비슷한 iterator. - v.end();
마지막 데이터의 다음을 가리킴. 포인터와 비슷한 iterator. - v.rbegin();
거꾸로 begin 위치의 데이터를 가리킴. 즉 마지막 원소를 가리킴. iterator. - v.rend();
거꾸로 end 위치를 가리킴. 즉 첫 번째 원소의 이전 위치를 가리킴. iterator. - v.push_back(5);
마지막 데이터 뒤에 데이터 5를 삽입. - v.pop_back();
마지막 원소 제거. - v.clear();
모든 원소 제거. - v.reserve(n);
n개의 데이터를 저장할 수 있는 공간을 동적할당으로 예약. - v.resize(n);
v의 크기를 n으로 변경. 원래 크기보다 작아지는 경우엔 뒤에서부터 지워짐. 원래 크기보다 커지는 경우엔 빈자리 0으로 초기화. - v.resize(n, 5);
v의 크기를 n으로 변경. 원래 크기보다 작아지는 경우엔 뒤에서부터 지워짐. 원래 크기보다 커지는 경우엔 빈자리 5로 초기화. - v.size();
데이터 갯수 리턴. - v.capacity();
할당된 공간 크기 리턴. - v2.swap(v1);
v1과 v2의 모든 것을 교환. - v.insert(5, 2);
5번째 위치에 2를 삽입. - v.insert(5, 2, 3);
5번째 위치를 시작으로 2를 3개 삽입. 가운데 끼워넣는 것이므로 전체 size 증가. - v.erase(iter);
iterator iter가 가리키는 데이터 삭제. 데이터가 삭제되었으므로 size 감소. - v.erase(iter1, iter2);
iter1부터 iter2이전까지 데이터 삭제. - v.empty();
v가 비어있으면 true, 비어있지 않으면 false 리턴. 즉 size가 0이면 true.
추가적으로 설명을 덧붙이자면 vector는 자동으로 크기가 필요한 만큼 늘어나는 배열이라고 볼 수 있지만, 동적할당에 시간이 걸리기 때문에 많은 메모리량이 필요한 것이 확실하다면 v.reserve(n) 함수로 필요한 만큼 미리 할당해놓을 수 있다.
그리고 vector size와 vector capacity는 차이가 있다. capacity는 그저 vector에 할당된 메모리를 의미하고, size는 그 메모리 중에서도 데이터가 들어가 있는 메모리량을 의미한다.
vector 예제
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> v = {1,2,3};
cout << "v[1] : " << v[1] << "\n"; // v[1] : 2
cout << "v.back() : " << v.back() << "\n"; // v.back() : 3
v.push_back(10);
cout << "v.back() <added> : " << v.back() << "\n"; // v.back() <added> : 10
cout << "v.size() : " << v.size() << "\n"; // v.size() : 4
v.push_back(12);
v.push_back(14);
v.push_back(16);
v.push_back(18);
cout << "v.size() <added> : " << v.size() << "\n"; // v.size() <added> : 8
v.pop_back();
cout << "v.size() <pop-1> : " << v.size() << "\n"; // v.size() <pop-1> : 7
cout << "v.back() <pop-1> : " << v.back() << "\n"; // v.back() <pop-1> : 16
v.pop_back();
cout << "v.size() <pop-2> : " << v.size() << "\n"; // v.size() <pop-2> : 6
cout << "v.back() <pop-2> : " << v.back() << "\n"; // v.back() <pop-2> : 14
v.pop_back();
cout << "v.size() <pop-3> : " << v.size() << "\n"; // v.size() <pop-3> : 5
cout << "v.back() <pop-3> : " << v.back() << "\n"; // v.back() <pop-3> : 12
}
'C++' 카테고리의 다른 글
[C++ STL] STL이란? (0) | 2022.07.27 |
---|