deque 컨테이너
- 헤더 < deque > 에 저장되어 있다.
- double-ended queue
- vector의 중간에 새로운 원소를 삽입시 성능 저하의 단점을 보완하기 위해 deque는 여러개의 메모리 블록을 할당하고 하나의 블록처럼 여기는 기능을 제공합니다.
- deque는 데이터 삽입과 삭제시 front 와 back에서 모두 이루어 질 수 있습니다.
- 하지만 시작이나 끝이 아닌 위치에서 요소를 자주 삽입하거나 제거하는 경우 여전히 list 나 forward_list 보다는 성능이 떨어집니다.
deque의 템플릿 구조.
template < class T, class Alloc = allocator<T> > class deque;
- 먼저 T 는 저장되어야할 요소의 타입이다. ex) int
- 다음으로 class Alloc 은 할당자 클래스 템플릿이 사용됩니다.
멤버함수
- construtor 와, destructor를 제공하며
- operator = 할당자함수도 제공한다.
요소 접근방법
- dq[index]
- index 번째 원소를 참조한다.
- 유효범위를 점검하지 않으므로 상대적으로 속도가 dq.at(index)보다 빠르다.
- dq.at(index)
- index 번째 원소를 참조한다.
- 유효범위를 점검하므로 dq[index] 보다 상대적으로 속도가 느리다.
- dq.front();
- 첫 번째 원소를 참조한다.
- dq.back();
- 마지막 원소를 참조한다.
Capacity
- dq.empty();
- size가 0이면 리턴 true, 아니면 리턴 false
- dq.size();
- 원소의 개수를 리턴한다.
- dq.max_size();
- deque 컨테이너가 보유할 수 있는 최대 요소 수 리턴.
- resize 전 크기 조정이 허용되는지 확인하는데 사용된다.
- dq.resize(n, value);
- value 생략인 dq.resize(n) 형태 -> 이전 사이즈보다 크게 수정하면 빈 자리는 0으로 대체되고, 작은 사이즈로 수정하면 기존 값은 사라진다.
- value 포함인 dq.resize(n, value) 형태 -> 이전 사이즈보다 크게 수정하면 이전 값들은 그대로 유지한채 나머지 사이즈만큼 value로 채운다.
- dq.shrink_to_fit();
- 컨테이너가 현재 크기에 맞게 메모리 사용량을 줄이도록 요청. 크기를 변경하지는 않는다.
수정
- dq.assign();
- 다음 세가지의 함수 오버로딩 형태를 가지고 있다.
- (1) range - void assign (InputIterator first, InputIterator last) first 위치부터, last 까지의 위치를 할당한다.
- (2) fill - void assign (size_type n, const value_type& val); n 만큼 val 값으로 채운다.
- (3) initializer list - void assign (initializer_list<value_type> il); initializer_list 의 값들을 같은순서로 복사한다.
- dq.push_back(n);
- 마지막 원소 뒤에 n을 삽입한다.
- dq.push_front(n);
- 첫 번째 원소 앞에 n을 삽입한다.
- dq.pop_back();
- 마지막 원소를 제거한다.
- dq.pop_front();
- 첫번째 원소를 제거한다.
- dq.insert(position, size, value);
- position의 위치부터 size만큼 value값을 저장한다.
- 삽입 시에 앞뒤 원소의 개수를 판단하여 적은 쪽으로 미루어서 삽입한다.
- 만약 앞의 원소가 적으면, 앞쪽으로 블록을 만들어서 언소를 옮기고 삽입.
- 만약 뒤의 원소가 적으면, 뒤쪽으로 블록을 만들어 원소를 옮기고 삽입.
- assign()과 마찬가지로 같은 기능을 하지만 다른건 첫번째 파라미터인 position부터 진행한다는 것이다.
- dq.erase();
- erase(const_iterator position); iter 가 가르키는 원소를 제거. 제거 한 후 앞뒤 원소 개수를 판단해 적은쪽의 원소를 당겨서 채움. 제거한 곳의 iter를 반환
- erase(const_iterator first, const_iterator last); 위와 같지만 first 부터 last를 재거.
- dq.clear();
- 모든 요소를 제거하고 size는 0으로 유지한다.
- dq.emplace(const_iterator position, Args&&… args);
- position 에 args 값을 넣는다.
- dq.emplace_front(Args&&… args);
- 맨 앞에 args 값을 넣는다.
- dq.emplace_back(Args&&… args);
- 맨 뒤에 args 값을 넣는다.
Examples
assign 예제
// deque::assign
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> first;
std::deque<int> second;
std::deque<int> third;
first.assign (7,100); // 7 ints with a value of 100
std::deque<int>::iterator it;
it=first.begin()+1;
second.assign (it,first.end()-1); // the 5 central values of first
int myints[] = {1776,7,4};
third.assign (myints,myints+3); // assigning from array.
std::cout << "Size of first: " << int (first.size()) << '\n';
std::cout << "Size of second: " << int (second.size()) << '\n';
std::cout << "Size of third: " << int (third.size()) << '\n';
return 0;
}
Output:
Size of first: 7
Size of second: 5
Size of third: 3
삽입 제거 예제
// deque::pop_front
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque;
mydeque.push_back (100);
mydeque.push_back (200);
mydeque.push_back (300);
std::cout << "Popping out the elements in mydeque:";
while (!mydeque.empty())
{
std::cout << ' ' << mydeque.front();
mydeque.pop_front();
}
std::cout << "\nThe final size of mydeque is " << int(mydeque.size()) << '\n';
return 0;
}
Outputs:
Popping out the elements in mydeque: 100 200 300
The final size of mydeque is 0
자세한 내용은 아래의 레퍼런스 참조 하세용
click reference site
Comments