-----추천-----
덱(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 함수를 사용해야 합니다.
프로그램을 모두 짯어요.
짯다고요.
뭐... 정성을 들이긴 했지만 뭔가 문제가있으면 태클 퍽 걸어줘요.