본문 바로가기

카테고리 없음

[C++]덱(deque) 사용하기



안녕하세요. 작은 프로그래머 이야기 블로그 주인장 free flight aircraft입니다. 즉석 강의를 할것인데요.이 강의는 덱(deque)에 대해서 강의를 할것입니다. 잘 부탁드려요.


-----추천-----


덱(deque)은 위 그림과 같이 앞쪽과 뒤쪽에 데이터를 삽입(push_front, push_back)하고 뒤쪽에 데이터를 빼내는(pop_front, pop_back) 구조를

갖고 있다. 물론 제공되는 함수를 사용하여 중간에 삽입하거나 중간 데이터를 삭제할 수도 있다. front() 함수는 덱의 제일 처음 데이터 자체

를 나타내며, back() 은 마지막 데이터 자체를 나타낸다. begin() 함수를 사용하면 덱의 제일 첫 번째 원소의 위치를 나타내는 반복자를 리턴

하며, end() 는 마지막 원소 다음 위치를 나타내는 반복자를 리턴한다. 반복자 개념은 이전의 반복자 강좌를 참고하여라.

덱도 덱과 마찬가지로 데이터를 삽입하면 저장하는 데이터 개수가 꽉 찬 경우 2배로 사이즈가 확장된다. 우리가 동적 확장을 신경쓰지 않

아도 사이즈가 2배씩 확장된다.

덱은 덱과 동일한 기능을 갖고 있으면서, 앞쪽에 데이터를 삽입하고 데이터를 빼내는 push_front 와 pop_front 가 추가됩니다.

 Q.덱에는 어떤 기능들이 제공되었나요?


 A.25 가지의 기능들이 제공되었죠. 밑을 보세요.

 at(pos) : pos 위치의 데이터를 나타낸다. pos 는 int 형을 사용한다.

[pos] : d[idx] 와 같이 [] 를 사용하여 배열처럼 다룰 수 있다.

begin() : 처음 데이터의 위치를 나타내는 반복자를 리턴한다.

end() : 마지막 데이터 다음 위치를 나타내는 반복자를 리턴한다.

rbegin() : 마지막 데이터 다음 위치를 가리킨다. 뒤에서 봤을 때 제일 첫 번째 위치를 나타내는 반복자를 리턴한다.

rend() : 뒤에서 봤을때 마지막 다음 위치 즉, 첫 번째 데이터 앞을 나타내는 반복자를 리턴한다.

empty() : 데이터가 현재 비어있는지를 나타낸다. (size() == 0) 으로 검사하는 것 보다 휠씬 효율적이다.

size() : 현재 덱에 저장된 원소 개수를 나타낸다.

resize(num) : 덱에 저장할 수 있는 데이터 개수를 num 개로 변경시킨다.

max_size() : 재할당을 최대로 하여 저장할 수 있는 허용하는 한 최대의 크기를 나타낸다.

assign(n, elem) : elem 원소를 n 개 복사한다.

assign(beg, end) : 반복자 beg 와 반복자 end-1 사이의 원소들을 복사한다.

swap(d2) : 동일한 덱 d2 와 현재 원소들을 모두 교환한다.

push_back(item) : 해당하는 아이템을 마지막에 삽입한다.

pop_back() : 제일 마지막 데이터를 제거한다.

push_front(item) : 해당하는 아이템을 제일 앞에 삽입한다.

pop_front() : 처음 데이터를 제거한다.

insert(pos, elem) : pos 위치에 elem 을 삽입한다.

insert(pos, n, elem) : pos 위치에 elem 을 n 개 삽입한다.

insert(pos, beg, end) : pos 위치에 beg 반복자 부터 end-1 반복자 위치의 데이터들을 삽입한다.

erase(pos) : pos 위치의 데이터를 제거하고, 다음 원소 위치를 리턴한다.

erase(beg, end) : beg 반복자 부터 end-1 원소들을 제거하고, end 위치의 원소를 리턴한다.

clear() : 덱을 비운다.

pop() : 덱이 비어 있지 않다면, 가장 최근 삽입한 데이터가 삭제된다.

size() : 현재 덱에 들어 있는 데이터의 개수를 알려준다.

이상과 같은 함수가 덱에서 제공된다. 나머지 함수들은 덱과 차이가 없으며, 파란색 함수들이 덱에서 추가되는 함수입니다. 벡터에서 제공되

던 reserve 함수와 capacity 함수가 없어집니다.

여러가지 데이터형에 따른 덱을 정의해봅시다.

먼저 덱을 사용하려면, #include <deque> 를 사용해야 합니다. 어떤 데이터형에 대해서도 처리하려면, 템플레이트 형의 덱을 사용하여 정의할수 있습니다.


deque<int> si;

deque<double> sd;

deque<string> ss;

위의 3개의 코드는 int 형의 데이터를 저장하는 덱, double 형을 저장하는 덱, 문자열을 저장하는 덱을 선언한 것입니다. 따라서

deque<사용하고자 하는 데이터 형> 변수이름;

과 같이 선언하면 일단 VC 에서 제공되는 덱을 사용하기 위한 초기 과정은 완성되었어요.

예제 코드를 살펴봅시다.


#include <deque>

#include <iostream>

#include <iterator>

#include <string>

using namespace std; //앞에 모두 std:: 라고 붙여주는 네임 스페이스 입니다.

int main(){

// 문자열을 원소로 사용하는 덱

deque<string> ss;

// 데이터 마지막에 삽입

ss.push_back("May");

ss.push_back("I");

ss.push_back("help");

ss.push_back("you");

ss.push_back("?");

// copy 알고리즘을 이용하여 출력

copy(ss.begin(), ss.end(), ostream_iterator<string>(cout, " "));

cout << endl;

// 정보를 보여준다.

cout << "덱에 저장할 수 있는 최대 개수 = " << ss.max_size() << endl;

cout << "현재 데이터 개수 = " << ss.size() << endl;

// 하나를 삭제한다.

ss.pop_back(); // 뒤쪽에서

ss.pop_front(); // 앞쪽에서

// 배열처럼 사용한다.

for(int i = 0; i < ss.size(); ++i) cout << ss[i] << " ";

cout << endl;

// 2개를 앞쪽에 삽입한다.

ss.push_front("...");

ss.push_front("^_^");

// copy 알고리즘을 이용하여 다시 출력

copy(ss.begin(), ss.end(), ostream_iterator<string>(cout, " "));

cout << endl;

// 정보를 보여준다.

cout << "현재 데이터 개수 = " << ss.size() << endl;

return 0;

}

//여기에 나오는 색깔과 컴파일러에 표시되는 색깔과는 아무런 관련이 없습니다. 같은색이 안뜬다고 뭐라하지마세요.


실행결과


May I help you ?

덱에 저장할 수 있는 최대 개수 = 268435455

현재 데이터 개수 = 5

I help you

^_^ ... I help you

현재 데이터 개수 = 5

덱은 앞쪽에서 삭제하는 함수와 추가되는 함수가 지원된다. 벡터를 사용하면 앞쪽에 insert, erase 함수를 사용해야 합니다.


프로그램을 모두 짯어요.

짯다고요.

뭐... 정성을 들이긴 했지만 뭔가 문제가있으면 태클 퍽 걸어줘요.