주니어 개발자의 대나무숲

[C++/STL]pair, vector 본문

PS (Problem Solving)/개념

[C++/STL]pair, vector

공대사람 2016. 10. 19. 14:59

가장 기본적인 STL 컨테이너라고 할 수 있는 pair와 vector에 대해서 먼저 알아보도록 하겠습니다.

이해하기 쉽도록 제 나름대로 정한 정의와 문제를 풀 때의 쓰임새를 알아보고 난 후, 멤버 함수들과 예제를 통해 사용법을 익혀보도록 하겠습니다.


1. pair


1) 정의[각주:1]

이름이 'first', 'second'인 두 개의 변수를 저장할 수 있는 struct


2) 용도[각주:2]

① 이차원 배열의 인덱스 

② 이차원 좌표평면에서의 좌표 

③ 정점 번호와 해당 정점 번호까지의 최단거리를 묶어서 저장해야 되는 경우 


3) 사용법

pair를 사용하기 위해서는 <utility>를 include 해야 합니다.

pair는 다른 컨테이너들에 비해 간단한 구조이기 때문에 멤버 함수가 적습니다. 따라서, 바로 예제를 통해 pair의 기본적인 사용법을 익혀보도록 하겠습니다.


4) 예제

1
2
3
4
5
6
7
8
9
10
11
12
//pair 선언
pair<int,int> p;
pair<char,double> p;
 
//pair 생성
int a = 1, b = 2;
pair<int,int> p = make_pair(a,b);
pair<int,int> p = make_pair(1,2);
 
//pair의 멤버 변수에 접근
int valA = p.first;
int valB = p.second;
cs


first가 1이고 second가 2인 pair를 만들기 위해, pair<int,int>를 선언한 후에 각 멤버 변수(first, second)를 초기화해주는 것이 아니라 make_pair를 이용해 바로 만들어낼 수 있다는 것을 알아두면 좋을 것 같습니다(예제의 8번째 줄 참고).





2. vector


1) 정의

사이즈가 유동적인 배열


2) 용도

배열을 사용하는 모든 경우


3) 사용법

vector를 사용하기 위해서는 <vector>를 include 해야 합니다.

vector는 특히 많이 사용되는 컨테이너입니다. 그래서, 그만큼 많은 종류의 멤버 함수를 사용하기도 합니다. 

편의상 멤버 함수의 적용 대상이 되는 벡터를 v라고 부르도록 하겠습니다.


 멤버 함수

 기능 

 v.size()

 v의 사이즈(물리적인 저장 용량이 아닌 원소의 개수)를 리턴

 v.resize(new_size)

 v를 new_size로 사이즈를 바꿔줌

 v.empty()

 v의 사이즈가 0인지 아닌지를 확인

 v.begin()

 v의 0번째 원소를 가리키는 iterator[각주:3] 리턴 

 v.end()

 v의 마지막 원소를 가리키는 iterator 리턴

 v.front()

 v의 0번째 원소를 리턴 

 v.back()

 v의 마지막 원소를 리턴

 v.push_back(val)

 v의 끝에 val을 추가 

 v.pop_back()

 v의 마지막 원소를 삭제 

 v.clear()

 v의 모든 원소를 삭제 


cf 1) <algorithm>에 있는 reverse()를 이용하면, vector에 속한 원소들의 순서를 거꾸로 뒤집을 수가 있습니다.

만약 원래의 vector가 1 5 2 3 였다면 reverse()한 결과는 3 2 5 1 이 됩니다.

사용법 : reverse(v.begin(), v.end());


cf 2) <algorithm>에 있는 sort()를 이용하면, vector에 속한 원소들을 오름차순으로 정렬할 수 있습니다.

만약 원래의 vector가 1 5 3 4 였다면 sort()한 결과는 1 3 4 5 가 됩니다.

사용법 : sort(v.begin(), v.end());

덧) 오름차순 뿐만 아니라 다른 정렬 기준으로도 정렬할 수 있으며, int로 이루어진 vector뿐만 아니라 다른 자료형으로 이루어진 vector도 정렬할 수 있습니다.


4) 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
vector<int> iv;
vector<pair<int,int>> pv;
 
//사이즈가 3인 vector 생성
vector<int> myv(3);
 
//사이즈가 N(5)이고, 각 원소가 2로 초기화된 vector 생성
int N = 5;
vector<int> myv(N, 2);
 
//vector에 원소 추가
iv.push_back(1);                 // iv : 1
iv.push_back(2);                 // iv : 1 2
iv.push_back(3);                 // iv : 1 2 3
 
pv.push_back(make_pair(2,4));
 
//vector의 size 조정
iv.resize(4);
cout << iv.size();                // 4
 
cout << iv.front();               // 1
cout << iv.back();                // 0 (resize를 4로 했기 때문에 마지막 원소는 자동적으로 0으로 초기화됨)
 
iv.pop_back();                    // iv : 1 2 
iv.clear();                       // iv : 
cs



  1. 엄밀한 정의가 아니라 제 나름대로 이해하기 쉽게 정리한 정의입니다. [본문으로]
  2. 이 외에도 많은 용도가 있겠지만 간단하게 정리하고 넘어가도록 하겠습니다. [본문으로]
  3. iterator가 뭔지 모르시는 분들은 C의 포인터와 비슷한 개념으로 이해하셔도 큰 무리는 없습니다. 후에, 컨테이너들을 다루는 다른 함수를 사용할 때 iterator의 개념이 필요하게 됩니다. [본문으로]

'PS (Problem Solving) > 개념' 카테고리의 다른 글

[그래프] 인접 행렬과 인접 리스트  (21) 2016.12.11
[C++/STL]map, set  (4) 2016.10.19
[C++/STL]queue, stack  (4) 2016.10.19
STL 사용법을 익혀야 하는 이유!  (1) 2016.10.18
PS를 할 때, 유의할 점!  (6) 2016.10.17
Comments