Clolent

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 << "  " ;

}


'Programing > C++ Algorithm' 카테고리의 다른 글

이진 탐색 ( Binary Search )  (0) 2016.07.03
Map ( 맵 ) 사용법 / STL  (0) 2016.06.29
탑 / 백준 2493 / 스택  (1) 2016.06.22
큐 구현 / 백준 10845 / Queue  (1) 2016.06.22
스택, 백준 10828번  (0) 2016.06.21
댓글 로드 중…

블로그 정보

Clolent - 커피물조절달인

최근에 게시된 글