페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#8572

Tutorial : STL Vector ( 1차원 ) 2s 1024MB

문제

이제, 가장 중요하고, 많이 쓰이는 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



출처

againalgo, ohjtgood

로그인해야 코드를 작성할 수 있어요.