• [转]STL之deque容器详解


    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>=

  • 相关阅读:
    js保留两位小数
    js字符串转成数字的三种方法
    『MySQL』索引类型 normal, unique, full text
    checkstyle配置文件说明
    如何更好地利用Pmd、Findbugs和CheckStyle分析结果
    Hibernate SQL优化技巧dynamic-insert="true" dynamic-update="true"
    Struts2 action的单例与多例
    Eclipse插件checkstyle安装使用
    html 动态显示元素文本
    脱离 Spring 实现复杂嵌套事务,之一(必要的概念)
  • 原文地址:https://www.cnblogs.com/eternal1025/p/4424264.html
Copyright © 2020-2023  润新知