문제
이제, 가장 중요하고, 많이 쓰이는 STL 자료구조 중 하나인 Vector 에 대해서 배워보자.
Vector 는 그냥 일차원 배열과 아예 똑같은 개념이다.
이번 시간에는 Vector 의 기본 사용법만 배울 것이다.
Vector 선언법
Vector 는 #include <vector> 헤더에 들어 있으며, using namespace std; 를 해주어야 한다.
기본 선언 형태는 vector <자료형> (벡터 이름); 이다.
vector <int> a; 라면 정수(int) 를 담는 Vector 가 되고,
vector <string> b; 라면 문자열(string) 을 담는 Vector 가 되며,
vector <pair<int, int>> c; 라면 순서 쌍(pair) 을 담는 Vector 가 되고,
vector <array<int, 5>> d; 라면 5개의 정수로 구성된 배열(array) 를 담는 Vector 가 된다.
선언 방법은 여러가지인데, 대표적인 4가지 방법을 소개한다. 아래 코드를 보자.
#include <vector>
using namespace std;
vector <int> v1;
vector <int> v2(5);
vector <int> v3(5, 99);
vector <int> v4 = {1, 3, 5, 7};v1 은 기본 선언 방법이다. 텅 빈 Vector 가 된다.
v2 는 5 칸 짜리 Vector 가 된다. 각 칸에는 모두 int 의 기본 값인 0 이 들어간다.
v3 은 마찬가지로 5 칸이며, 모든 칸에 99 가 들어간다.
v4 는 4칸이며, 차례대로 1, 3, 5, 7 이 들어간다.
그림으로 나타내면 아래와 같다.
아래 코드는 런타임 에러가 난다.
vector <int> v(5);
v[7] = 1;v 를 처음에 5칸 만들었으면 v[0] ~ v[4] 까지만 존재한다.
v[7] 은 이를 벗어나기에 에러가 발생하게 된다.
Vector 크기에 항상 주의하자.
Vector 에 원소 추가, 삭제
Vector 에 원소를 추가하고 삭제할 때는 push_back() 과 pop_back() 함수가 쓰인다.
아래 코드를 보자.
vector <int> v = {1, 3, 5, 7};
v.pop_back();
v.push_back(9);pop_back() 은 영어 뜻에서 유추할 수 있듯이, 맨 뒤의 원소를 삭제한다. ( 어떤 값인지 알려주지는 않는다. )
push_back(9)는, 맨 뒤에 9 라는 원소를 삽입한다.
이를 그림으로 표현하면 아래와 같다.
여기서 중요한 점은, Vector v 의 크기가 실시간으로 바뀐다는 것이다!
처음에 v.pop_back() 을 하면, v[3] = 0 이 되는 것이 아니고, v[3] 이라는 칸 자체가 사라진다 !
그래서 v 의 크기는 4 칸에서 3 칸으로 줄어들게 되는 것이다.
반대로, v.push_back(9)를 하면, 없어졌던 v[3] 칸이 다시 생기고,
v 의 크기가 3 칸에서 4 칸으로 늘어나게 된다.
이외의 주요 함수들
이제 그 외의 Vector 에서 유용하게 쓰이는 함수들을 보자.
위 함수들은 Vector 를 다루다 보면 자연스럽게 익히게 될 것이다.
Vector 정렬하기
처음부터 끝까지 정렬하는 코드는 아래와 같다.
sort( v.begin() , v.end() );S 번 칸부터 E 번 칸까지 정렬하는 코드는 아래와 같다.
sort( v.begin() + S , v.begin() + E + 1 );<응용 문제>
초기 크기가 N 인 정수 Vector 를 하나 만들고, 모든 칸을 정수 X 로 초기화한다.
그 후 다음 5가지 명령을 처리한다.
i a: 현재 시점 벡터의 맨 뒤에 원소 a를 삽입하여 벡터의 크기를 하나 늘린다.
r: 현재 시점 벡터의 맨 뒤에 있는 원소를 삭제하고, 벡터의 크기를 하나 줄인다. 만약 벡터가 비어있었다면 아무 일도 하지 않는다.
s: 현재 시점 벡터를 오름차순으로 정렬한다.
t: 현재 시점 벡터의 맨 앞에 있는 원소와 맨 뒤에 있는 원소를 맞바꾼다. 만약 벡터가 비어있었다면 아무 일도 하지 않는다.
e: 현재 시점 벡터를 앞에서부터 출력하고, 프로그램을 종료한다.
[제약조건]
(0≤n≤10 , 0≤x≤100,000 , 0≤(insert 명령으로 주어지는 정수 a)≤100,000)
주어지는 명령의 총 개수는 1,000개 이하이다.
입력
첫 줄에 N 과 X 가 주어진다.
그 다음 줄에 5 가지 명령 중 하나가 주어진다. e가 입력될 때까지 계속된다.
출력
마지막 명령이 주어질 때 벡터에 남아있는 원소를 앞에서부터 공백을 사이에 두고 출력한다.
마지막엔 반드시 한 개 이상의 원소가 남아있음을 보장한다.
예제
5 2
r
r
i 6
t
r
i 3
i 10
s
i 8
t
e
8 2 3 6 10 2