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