Deque 容器

deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。

使用deque容器之前必须加上<deque>头文件:#include<deuqe>;

deque属于std命名域的内容,因此需要通过命名限定:using std::deque;也可以直接使用全局的命名空间方式:using namespace std;

构造函数

  deque<Elem> c 创建一个空的deque

  deque<Elem> c1(c2) 复制一个deque。

  deque<Elem> c(n) 创建一个deque,含有n个数据,数据均已缺省构造产生。

  deque<Elem> c(n, elem) 创建一个含有n个elem拷贝的deque。

  deque<Elem> c(beg,end) 创建一个以[beg;end)区间的deque。

  ~deque<Elem>() 销毁所有数据,释放内存。

成员函数

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

c.end()返回指向最后一个元素下一个位置的迭代器

1     deque<int> d {1,2,3,4,5};
2 deque<int>::iterator it;
3 for(it=d.begin();it!=d.end();it++){
4 cout << *it << " ";
5 }
6 cout << endl;

c.rbegin()返回指向反向队列的第一个元素的迭代器(即原队列的最后一个元素)

c.rend()返回指向反向队列的最后一个元素的下一个位置(即原队列的第一个元素的前一个位置)

1     deque<int> d {1,2,3,4,5};
2 deque<int>::reverse_iterator it;
3 for(it=d.rbegin();it!=d.rend();it++){
4 cout << *it << " ";
5 }
6 cout << endl;

operator=赋值运算符重载

1     deque<int> d1 {1,2,3,4,5},d2;
2 d2 = d1;
3 deque<int>::iterator it;
4 for(it=d2.begin();it!=d2.end();it++){
5 cout << *it << " ";
6 }
7 cout << endl;

c.assign(n,num)将n个num拷贝复制到容器c

c.assign(beg,end)将[beg,end)区间的数据拷贝复制到容器c

 1     deque<int> d1 {1,2,3,4,5},d2;
2 d2.assign(2, 8);
3 deque<int>::iterator it;
4 cout << "d2.assign(n,num):";
5 for(it=d2.begin();it!=d2.end();it++){
6 cout << *it << " ";
7 }
8 d2.assign(d1.begin(), d1.begin()+3);
9 cout << "d2.assign(beg,end):";
10 for(it=d2.begin();it!=d2.end();it++){
11 cout << *it << " ";
12 }
13 cout << endl;

c.at(pos)返回索引为pos的位置的元素,会执行边界检查,如果越界抛出out_of_range异常

1     deque<int> d {1,2,3,4,5};
2 cout << "d.at(pos):" << d.at(2);
3 return 0;

c.operator[]下标运算符重载

1     deque<int> d {1,2,3,4,5};
2 cout << "d[2]:" << d[2];
3 return 0;

c.empty()判断c容器是否为空

1     deque<int> d {1,2,3,4,5};
2 if(!d.empty()){
3 cout << "d is not empty!" << endl;
4 }else{
5 cout << "d is empty!" << endl;
6 }
7 return 0;

c.front()返回c容器的第一个元素

c.back()返回c容器的最后一个元素

1     deque<int> d {1,2,3,4,5};
2 if(!d.empty()){
3 cout << "d.front():" << d.front() << endl;
4 cout << "d.back(): " << d.back() << endl;
5 }

c.size()返回c容器中实际拥有的元素个数

1     deque<int> d {1,2,3,4,5};
2 cout << "d.size():" << d.size() << endl;
3 return 0;

c.max_size()返回c容器可能存放元素的最大数量

1     deque<int> d {1,2,3,4,5};
2 cout << "d.max_size():" << d.max_size() << endl;
3 return 0;

c.clear()清除c容器中拥有的所有元素

 1     deque<int> d {1,2,3,4,5};
2 deque<int>::iterator it;
3 cout << "clear before:" ;
4 for(it=d.begin();it!=d.end();it++){
5 cout << *it << " ";
6 }
7 cout << endl;
8 d.clear();
9 cout << "clear after:" ;
10 for(it=d.begin();it!=d.end();it++){
11 cout << *it << " ";
12 }
13 cout << endl;

c.insert(pos,num)在pos位置插入元素num

c.insert(pos,n,num)在pos位置插入n个元素num

c.insert(pos,beg,end)在pos位置插入区间为[beg,end)的元素

 1     deque<int> d {1,2,3,4,5};
2 deque<int>::iterator it;
3 cout << "insert before:" ;
4 for(it=d.begin();it!=d.end();it++){
5 cout << *it << " ";
6 }
7 cout << endl;
8 d.insert(d.end(),22);
9 d.insert(d.end(), 3,88);
10 int a[5] = {1,2,3,4,5};
11 d.insert(d.begin(),a,a+3);
12 cout << "insert after:" ;
13 for(it=d.begin();it!=d.end();it++){
14 cout << *it << " ";
15 }
16 cout << endl;

c.erase(pos)删除pos位置的元素c.erase(beg,end)删除区间为[beg,end)的元素

c.erase(beg,end)删除区间为[beg,end)之间的元素

 1     deque<int> d {1,2,3,4,5};
2 d.erase(d.begin());
3 deque<int>::iterator it;
4 cout << "erase(pos) after:" ;
5 for(it=d.begin();it!=d.end();it++){
6 cout << *it << " ";
7 }
8 cout << endl;
9 d.erase(d.begin(), d.begin()+3);
10 cout << "erase(beg,end) after:" ;
11 for(it=d.begin();it!=d.end();it++){
12 cout << *it << " ";
13 }
14 cout << endl;

c.push_back(num)在末尾位置插入元素

c.pop_back()删除末尾位置的元素

c.push_front(num)在开头位置插入元素

c.pop_front()删除开头位置的元素

 1     deque<int> d {1,2,3,4,5};
2 d.push_back(10);
3 deque<int>::iterator it;
4 cout << "push_back(num):" ;
5 for(it=d.begin();it!=d.end();it++){
6 cout << *it << " ";
7 }
8 cout << endl;
9
10 d.pop_back();
11 cout << "pop_back(num):" ;
12 for(it=d.begin();it!=d.end();it++){
13 cout << *it << " ";
14 }
15 cout << endl;
16
17 d.push_front(10);
18 cout << "push_front(num):" ;
19 for(it=d.begin();it!=d.end();it++){
20 cout << *it << " ";
21 }
22 cout << endl;
23
24 d.pop_front();
25 cout << "pop_front(num):" ;
26 for(it=d.begin();it!=d.end();it++){
27 cout << *it << " ";
28 }
29 cout << endl;
30 return 0;

c.resize(num)从新定义容器的大小

 1     deque<int> d {1,2,3,4,5};
2 cout << "d.size():" << d.size() << endl;
3 d.resize(d.size()+5);
4 cout << "d.resize() after:" << d.size() <<endl;
5 deque<int>::iterator it;
6 cout << "resize() after:" ;
7 for(it=d.begin();it!=d.end();it++){
8 cout << *it << " ";
9 }
10 cout << endl;

c1.swap(c2)交换容器c1,c2;

swap(c1,c2)同上。

 1     deque<int> d1 {1,2,3,4,5},d2,d3;
2 d1.swap(d2);
3 deque<int>::iterator it;
4 cout << "d1 swap after:" ;
5 for(it=d1.begin();it!=d1.end();it++){
6 cout << *it << " ";
7 }
8 cout << endl;
9 cout << "d2 swap after:" ;
10 for(it=d2.begin();it!=d2.end();it++){
11 cout << *it << " ";
12 }
13 cout << endl;
14
15 swap(d3,d2);
16 cout << "d3 swap after:" ;
17 for(it=d3.begin();it!=d3.end();it++){
18 cout << *it << " ";
19 }
20 cout << endl;

重载运算符

operator==

operator!=

operator<

operator<=

operator>

operator>=

[转]STL之deque容器详解的更多相关文章

  1. 2.4 C++STL deque容器详解

    文章目录 2.4.1 引入 2.4.2 代码示例 2.4.3 代码运行结果 2.4.4 具体案例 总结 2.4.1 引入 deque容器类比vector容器来学习. deque为双向开口容器,见下图. ...

  2. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  3. STL:deque用法详解

    deque函数: deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素.但它又与vector不同,deque支持高效插入和 ...

  4. STL之deque用法详解

    C++ Deque(双向队列): Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用 ...

  5. STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  6. [转]STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  7. [转]STL之list容器详解

    List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用list容 ...

  8. 2.8 C++STL set/multiset容器详解

    文章目录 2.8.1 引入 2.8.2 代码示例 2.8.3 代码运行结果 2.8.4 对组pair的补充 代码实例 运行结果 总结 2.8.1 引入 set/multiset容器概念 set和mul ...

  9. 2.9 C++STL map/multimap容器详解

    文章目录 2.9.1 引入 2.9.2 代码示例 map案列 multimap案列 2.9.3 代码运行结果 总结 2.9.1 引入 map相对于set区别,map具有键值和实值,所有元素根据键值自动 ...

随机推荐

  1. Leetcode 99.恢复二叉搜索树

    恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 输出: [3,1,null,null,2] 示例  ...

  2. 九度oj 题目1045:百鸡问题

    题目1045:百鸡问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:10418 解决:4559 题目描述: 用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一 ...

  3. Ubuntu 16.04下没有“用户和组”功能的问题解决

    在16.04以前的版本会自带“用户和组”的功能,但是在16.04发现系统只自带了“用户账户”的功能. 问题解决: 1.安装gnome-system-tools sudo apt-get install ...

  4. 29、Java并发性和多线程-非阻塞算法

    以下内容转自http://ifeve.com/non-blocking-algorithms/: 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在 ...

  5. 查看表空间使用率及shrink 表空间

    首先,可以通过下面的sql statement来查看表空间的使用情况.注意,该语句是在10g下测试过. SELECT FREE.TABLESPACE_NAME, FREE.FREE_SPACE/TOT ...

  6. Jupyter Notebook: 解决build docker-stacks时conda太慢的问题

    当想使用docker安装Jupyter Notebook时,有一个很好的项目是docker-stacks(https://github.com/jupyter/docker-stacks/tree/m ...

  7. Unity3D开发——LeRunning的人物角色信息的显示

    ///////////////////////2015/08/22/////////////// //////////////////////by    xbw/////////////////// ...

  8. Fragment中的setUserVisibleHint()方法调用

    使用Fragment的时候难免会遇到想在视图可见与不可见之中做些操作.此时一般会想到类似Activity中的onResume()和onPause()方法.Fragment中也确实有这两个方法,然而亲測 ...

  9. Ubuntu12.04.3LTS安装Oracle Java 7

    今天在ubuntu 12.04 LTS 上安装Matlab时总是出错,显示拷贝jar包(cp "xx.jar")出现错误,在网上搜索了一下发现原来是没有安装java.自己打算安装o ...

  10. Levenberg–Marquardt algorithm

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFubWVuZ3dlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...