Vector 를 사용하는 경우는
1. 배열의 형태를 사용하고 싶은데 그 배열의 크기가 얼마나 될지 예상이 안갈때
2. 배열의 형태를 사용하되, 링크드 리스트 처럼 중간중간 연결을 끊거나 사이사이에 새로운 요소를 넣을 때 주로 사용되곤 한다.
선언 하는 방법
우선 #include <vector> 을 하고
vector< type > 변수명 이다. 이는 그냥 벡터만 단순히 선언을 한것이고
vector< type > 변수명 ( n ) 기본값 으로 초기화된 n 만큼의 원소를 가지고 있는 벡터를 선언
vector< type > 변수명 ( n , x ) x 값으로 초기화된 n 만큼의 원소를가지고 있는 벡터를 선언한다.
이때 사용할수 있는 유용한 것이 추가로 있다. 바로 pair 다.
좌표를 저장하고 싶거나 한번에 2개이상의 값을 저장해야 할경우
' vector < pair < type, type >> 변수명 ' 이런식으로 할 경우, 값 2개를 한번에 저장할 수 있다.
벡터에 있는 여러 함수들을 소개 하겠다. 필자는 필자가 자주 사용하는 함수들만을 소개하겠다.
vector.at( i ) 벡터에 있는 i 번째 원소를 참조한다.
vector.back( ) 벡터의 마지막 원소를 참조한다.
back 으로 참조되는 것은 마지막 원소이므로 vector.end( ) 와는 다르다 !
※ 여기서 참조라는 것은 그 위치를 반환한다는 것으로 -> 등을 이용하여 접근 할수 있다.
vector.begin( ) 시작 원소의 주소값은 반환한다.( 참조한다 )
vector.front( ) 와는 다르다. begin 은 iterator 로 받아서, 일종의 포인터로 활용해야하지만, front는 그냥 그 값을 반환한다. 밑에서 예시로 다루겠다.
vector.end ( ) 마지막 원소의 그 다음을 참조한다.
이곳의 원소들을 접근하려하면 오류가 난다. 그냥 벡터의 마지막을 의미하는 곳이기 때문이다.
vector.clear( ) 벡터의 모 든 원소를 제거한다.
vector.empty( ) 벡터가 비어있는지를 조사한다. 비어있다면 1을 아니라면 0 을 반환한다.
q = vector.erase( i ) i 가 가리키는 원소를 제거한다. q는 이제 그 다음 원소를 가리키게 된다.
q = vector.erase( a, b ) a 에서 b 를 제거한다.
vector.push_back( x ) 벡터에 x를 추가한다. 마지막 위치에 추가한다 가장 핵심 !
vector.pop_back ( ) 벡터의 마지막 원소를 제거한다.
vector.rbegin( ) 과 vector.rend( ) 앞에서 뒤로 가는게 아니고 뒤에서 앞으로 올때 사용하는 함수들로
맨 뒤 원소를 반환하고 첫번째 원소의 그앞을 반환한다.
vector.size( ) 현재 벡터의 원소의 갯수를 반환 한다.
vector.swap( vector2 ) vector 와 vector2 를 swap 한다. 아예 두 벡터를 교체하는 것
vector.insert( a, b ) a가 가리키는 위치에 b 를 집어 넣는다.
예제 1 단순한 push_back 과 출력
vector<int> vec ; vec.push_back(1); vec.push_back(3); vec.push_back(5); vec.push_back(2); vec.push_back(8); for (auto a = vec.begin(); a != vec.end(); a++) { cout << *a << " "; } |
1 3 5 2 8 push_back 된 순서대로 출력이 된다.
|
※ auto 를 사용하면 자동으로 필요한 형식으로 a가 스스로 변형되서 사용된다.
예제2 추가로 front / erase / insert 사용
추가된 코드 |
결과 |
cout << vec.front() |
1 |
vec.erase(vec.begin()) |
3 5 2 8 |
vec.insert(vec.begin(), 100 ) |
100 3 5 2 8 |
전체 코드
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
vec.push_back(2);
vec.push_back(8);
vec.erase(vec.begin());
vec.insert(vec.begin(), 100);
for (auto a = vec.begin(); a != vec.end(); a++) {
cout << *a << " ";
}
return 0;
}
그외의 함수들은 직접 이것저것 직접 코딩해서 시험 하면 쉽게 사용 법을 익힐수 있다. 그런데 벡터에 내가 입력한 값들이 잘 들어갔나 한번 쭉 보고싶을때는 대부분 iterator 을 사용하는데, 대체 이게 뭔가 싶은 분들이 분명 존재할 것같다. 내가 이해한대로 풀어보자면
vector 나 map, set 등에서 전용으로 사용되는 "반복자" 로 이 벡터 등 안에서 하나하나 짚어가며 가리켜주는 화살표 정도로 이해하면 될것같다.
선언하는 방법은 vector< type >::iterator 이름 으로 선언이 가능하고 일종의 포인터로 초기화를 해주어야 하는데 대부분의 경우 벡터 등의 앞에서 맨 끝까지를 탐색하는 경우다.
iterator 로 초기화를 했는데, 그 다음엔 어떻게 참석을 하는가 ? 일반적으로 ++ 혹은 -- 를 사용할수 있다.
++는 그다음 원소를 --는 그 이전 원소를 가리킨다.
예제로 처음부터 끝까지, 벡터를 탐색하며 그 원소들을 출력하는 for 문을 본다면 ( 위의 예제 코드에 이어서 )
vector<int>::iterator iter ;
for ( iter = vec.begin() ; iter != vec.end() ; iter++ ){
cout << *iter << " " ;
}
거꾸로 뒤에서부터 앞으로 탐색하며 원소를 탐색을 하려고 하면 어떨까
※ rbegin 을 사용하였으면 반드시 rend 로 마무리를 해야한다. rbegin 해놓고 end 를 사용하면 오류난다 !
for( iter = vec.rbegin() ; iter != vec.rend() ; iter++ ) {
cout << *iter << " " ;
}