龙空技术网

再不要说,不了解顺序容器-STL deque

我是程序员编程指南呀 29

前言:

现在看官们对“队列deque”大约比较珍视,朋友们都需要了解一些“队列deque”的相关内容。那么小编在网络上汇集了一些关于“队列deque””的相关文章,希望大家能喜欢,小伙伴们快快来了解一下吧!

Deuqe概念

容器deque和vector非常相似,属于序列式容器。都是采用动态数组来管理元素,提供随机存取,并且有着和vector一样的接口。不同的是deque具有首尾两端进行快速插入、删除的能力。

Deque结构

是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。

deque在实现上主要有以下两点:

1.由一段一段的定量连续空间构成,第一个区块朝某个方向扩展,最后一个区块朝相反方向扩展;

2.管理这些分段的定量连续空间,维护其整体连续的假象,并提供随机存取的接口;

1.Constructors 创建一个新双向队列

语法:

deque();//创建一个空双向队列;

deque( size_type size );// 创建一个大小为size的双向队列

deque( size_type num, const TYPE &val ); //放置num个val的拷贝到队列中

deque( const deque &from );// 从from创建一个内容一样的双向队列

deque(input_iteratorstart,input_iterator end );// start 和 end - 创建一个队列,保存从start到end的元素。

2.Operators 比较和赋值双向队列

//可以使用[]操作符访问双向队列中单个的元素

3.assign() 设置双向队列的值

语法:

void assign( input_iterator start, input_iterator end); //start和end指示的范围为双向队列赋值

void assign( Size num, const TYPE &val );//设置成num个val。

4.at() 返回指定的元素

语法:

reference at( size_type pos ); 返回一个引用,指向双向队列中位置pos上的元素

5.back() 返回最后一个元素

语法:

reference back();//返回一个引用,指向双向队列中最后一个元素

6.begin() 返回指向第一个元素的迭代器

语法:

iterator begin();//返回一个迭代器,指向双向队列的第一个元素

7.clear() 删除所有元素

8.empty() 返回真如果双向队列为空

9.end() 返回指向尾部的迭代器

10.erase() 删除一个元素

语法:

iterator erase( iterator pos ); //删除pos位置上的元素

iterator erase( iterator start, iterator end ); //删除start和end之间的所有元素

//返回指向被删除元素的后一个元素

11.front() 返回第一个元素的引用

12.get_allocator() 返回双向队列的配置器

13.insert() 插入一个元素到双向队列中

语法:

iterator insert( iteratorpos,size_type num, const TYPE &val ); //pos前插入num个val值

void insert( iterator pos, input_iterator start, input_iterator end ); //插入从start到end范围内的元素到pos前面

14.max_size() 返回双向队列能容纳的最大元素个数

15.pop_back() 删除尾部的元素

16.pop_front() 删除头部的元素

17.push_back() 在尾部加入一个元素

18.push_front() 在头部加入一个元素

19.rbegin() 返回指向尾部的逆向迭代器

20.rend() 返回指向头部的逆向迭代器

21.resize() 改变双向队列的大小

22.size() 返回双向队列中元素的个数

23.swap() 和另一个双向队列交换元素

语法:

void swap( deque &target );// 交换target和现双向队列中元素

1.deque::deque

构造一个deque容器对象,根据所使用的构造函数版本初始化它的内容:

Example

#include <iostream>#include <deque>int main (){  unsigned int i;  // constructors used in the same order as described above:  std::deque<int> first;                                // empty deque of ints  std::deque<int> second (4,100);                       // four ints with value 100  std::deque<int> third (second.begin(),second.end());  // iterating through second  std::deque<int> fourth (third);                       // a copy of third  // the iterator constructor can be used to copy arrays:  int myints[] = {16,2,77,29};  std::deque<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );  std::cout << "The contents of fifth are:";  for (std::deque<int>::iterator it = fifth.begin(); it!=fifth.end(); ++it)    std::cout << ' ' << *it;  std::cout << '\n';  return 0;}

Output:

he contents of fifth are: 16 2 77 29 

2. deque::push_back

在当前的最后一个元素之后 ,在deque容器的末尾添加一个新元素。val的内容被复制(或移动)到新的元素。

这有效地增加了一个容器的大小。

void push_back (const value_type& val);void push_back (value_type&& val);

Example

#include <iostream>#include <deque>int main (){  std::deque<int> mydeque;  int myint;  std::cout << "Please enter some integers (enter 0 to end):\n";  do {    std::cin >> myint;    mydeque.push_back (myint);  } while (myint);  std::cout << "mydeque stores " << (int) mydeque.size() << " numbers.\n";  return 0;}

output:

Please enter some integers (enter 0 to end):1 2 3 4 5 0mydeque stores 6 numbers.

3. deque::push_front

在deque容器的开始位置插入一个新的元素,位于当前的第一个元素之前。val的内容被复制(或移动)到插入的元素。

这有效地增加了一个容器的大小。

void push_front (const value_type& val);void push_front (value_type&& val);

Example:

#include <iostream>#include <deque>int main (){  std::deque<int> mydeque (2,100);     // two ints with a value of 100  mydeque.push_front (200);  mydeque.push_front (300);  std::cout << "mydeque contains:";  for (std::deque<int>::iterator it = mydeque.begin(); it != mydeque.end(); ++it)    std::cout << ' ' << *it;  std::cout << '\n';  return 0;}

Output

300 200 100 1001
4. deque::pop_back

删除deque容器中的最后一个元素,有效地将容器大小减少一个。

这破坏了被删除的元素。

void pop_back();

Example

#include <iostream>#include <deque>int main (){  std::deque<int> mydeque;  int sum (0);  mydeque.push_back (10);  mydeque.push_back (20);  mydeque.push_back (30);  while (!mydeque.empty())  {    sum+=mydeque.back();    mydeque.pop_back();  }  std::cout << "The elements of mydeque add up to " << sum << '\n';  return 0;}

Output

The elements of mydeque add up to 601

5. deque::pop_front

删除deque容器中的第一个元素,有效地减小其大小。

这破坏了被删除的元素。

void pop_front();

Example

#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;}

Output

Popping out the elements in my deque: 100 200 300The final size of mydeque is 0

6. deque::emplace_front

在deque的开头插入一个新的元素,就在其当前的第一个元素之前。这个新的元素是用args作为构建的参数来构建的。

这有效地增加了一个容器的大小。

该元素是通过调用allocator_traits::construct来转换args来创建的。

存在一个类似的成员函数push_front,它可以将现有对象复制或移动到容器中。

template <class... Args>  void emplace_front (Args&&... args);

Example

#include <iostream>#include <deque>int main (){  std::deque<int> mydeque = {10,20,30};  mydeque.emplace_front (111);  mydeque.emplace_front (222);  std::cout << "mydeque contains:";  for (auto& x: mydeque)    std::cout << ' ' << x;  std::cout << '\n';  return 0;}

Output

mydeque contains: 222 111 10 20 30

7. deque::emplace_back

在deque的末尾插入一个新的元素,紧跟在当前的最后一个元素之后。这个新的元素是用args作为构建的参数来构建的。

这有效地增加了一个容器的大小。

该元素是通过调用allocator_traits::construct来转换args来创建的。

存在一个类似的成员函数push_back,它可以将现有对象复制或移动到容器中

template <class... Args>void emplace_back (Args&&... args);

Example

#include <iostream>#include <deque>int main (){  std::deque<int> mydeque = {10,20,30};  mydeque.emplace_back (100);  mydeque.emplace_back (200);  std::cout << "mydeque contains:";  for (auto& x: mydeque)    std::cout << ' ' << x;  std::cout << '\n';  return 0;}

Output

mydeque contains: 10 20 30 100 200

标签: #队列deque #队列deque约束