zoukankan      html  css  js  c++  java
  • deque容器

    一.摘要

    1.功能:双端队列(双端数组),可以对头尾端进行插入删除操作

    2.deque与vector区别:

    • vector对于头部的插入删除效率低,数据量越大,效率越低

    • deque相对而言,对头部的插入删除速度会比vector快

    • vector访问元素时的速度会比deque快,这和两者内部实现有关

    • deque没有容量capcity的概念,理论上可以无限扩展

    3.deque原理:

    • deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
    • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

    二.构造函数

    函数原型:

    deque<T> deqT; //默认构造形式
    deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。
    deque(n, elem); //构造函数将n个elem拷贝给本身。
    deque(const deque &deq); //拷贝构造函数

     示例代码:

     1 /**deque构造函数*/
     2 #include<iostream>
     3 #include<deque>
     4 using namespace std;
     5 void print_deque(const deque<int>&d){
     6     //const_iterator是只读迭代器,队列是const修饰的,那么必须用只读迭代器 
     7     for(deque<int>::const_iterator i=d.begin();i!=d.end();i++){ 
     8         cout<<*i<<" ";
     9     }
    10     cout<<endl;
    11 }
    12 void init(deque<int>&d){
    13     int i;
    14     for(i=0;i<10;i++){
    15         d.push_front(i);//前插 
    16         d.push_back(i);//后插 
    17     } 
    18 }
    19 int main(){
    20     deque<int>d1;
    21     init(d1);                            //deque<T> deqT;
    22     cout<<"队列d1:";    
    23     print_deque(d1); 
    24     deque<int>d2(d1.begin(),d1.end());    //deque(beg, end);
    25     cout<<"队列d2:";
    26     print_deque(d2);
    27     deque<int>d3(3,6);                    //deque(n, elem); 
    28     cout<<"队列d3:";
    29     print_deque(d3);
    30     deque<int>d4(d3);                    //deque(const deque &deq);
    31     cout<<"队列d4:";
    32     print_deque(d4);
    33     return 0;
    34 } 
    deque构造函数

     运行结果:

     三.赋值操作

    函数原型:

    deque& operator=(const deque &deq); //重载等号操作符
    assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
    assign(n, elem); //将n个elem拷贝赋值给本身。

    示例代码:

     1 #include<iostream>
     2 #include<deque>
     3 using namespace std;
     4 void printDeque(const deque<int>&d) {
     5     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
     6         cout << *it << " ";
     7     }
     8     cout << endl;
     9 }
    10 int main() {
    11     deque<int>d1;
    12     for (int i = 0; i < 6; i++) {//赋值6个6
    13         d1.push_back(6);
    14     }
    15     cout << "d1:";
    16     printDeque(d1);
    17     deque<int>d2 = d1;                //deque& operator=(const deque &deq);
    18     cout << "d2:";
    19     printDeque(d2);
    20     deque<int>d3;
    21     d3.assign(d1.begin(), d1.end());//assign(beg, end);
    22     cout << "d3:";
    23     printDeque(d3);
    24     deque<int>d4;
    25     d4.assign(5, 6);
    26     cout << "d4:";
    27     printDeque(d4);                    //assign(n, elem); 
    28     system("pause");
    29     return 0;
    30 }
    deque赋值操作

    运行结果:

     四.大小操作

    函数原型:

    deque.empty(); //判断容器是否为空
    deque.size(); //返回容器中元素的个数
    deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
    deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。      

    示例代码:

     1 /**deque大小操作*/
     2 #include<iostream>
     3 #include<deque>
     4 using namespace std;
     5 void printDeque(const deque<int>&d) {
     6     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
     7         cout << *it << " ";
     8     }
     9     cout << endl;
    10 }
    11 int main() {
    12     deque<int>d1;
    13     for (int i=0; i < 10; i++) {
    14         d1.push_back(i);
    15     }
    16     printDeque(d1);
    17     if (d1.empty()) {    //deque.empty();
    18         cout << "d1为空!" << endl;
    19     }
    20     else{
    21         cout << "d1不为空!" << endl;
    22         cout << "d1的大小为:" << d1.size() << endl;    //deque.size(); 
    23         //deque容器没有容器的概念,它可以无限大
    24     }
    25     //重新指定大小
    26     cout << "指定大小为15(超出的填充0):";
    27     d1.resize(15);    //deque.resize(num);(超出原来的长度的部分用0来填充)
    28     printDeque(d1);
    29     cout << "指定大小为20(超出的填充4):";
    30     d1.resize(20, 4);    //deque.resize(num, elem); (超出原来的长度部分用6来填充)
    31     printDeque(d1);
    32     system("pause");
    33     return 0;
    34 }
    35 
    36 deque大小操作
    deque大小操作

    运行结果:

     五.插入和删除

    函数原型:

    两端插入操作:
    push_back(elem); //在容器尾部添加一个数据
    push_front(elem); //在容器头部插入一个数据
    pop_back(); //删除容器最后一个数据
    pop_front(); //删除容器第一个数据
    指定位置操作:
    insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
    insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
    insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
    clear(); //清空容器的所有数据
    erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
    erase(pos); //删除pos位置的数据,返回下一个数据的位置。

    示例代码;

     1 /*deque插入和删除*/
     2 #include<iostream>
     3 #include<deque>
     4 using namespace std;
     5 void printDeque(const deque<int>&d) {
     6     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
     7         cout << *it << " ";
     8     }
     9     cout << endl;
    10 }
    11 int main() {
    12     deque<int>d;
    13     d.push_front(10);    //push_front(elem);
    14     d.push_front(20);
    15     d.push_back(100);    //push_back(elem);
    16     d.push_back(200);
    17     cout << "两端插入数据:";
    18     printDeque(d);
    19     d.pop_front();        //pop_front();
    20     d.pop_back();        //pop_back();
    21     cout << "两端删除数据:";
    22     printDeque(d);
    23     d.insert(d.begin(), 6);//insert(pos,elem);
    24     cout << "在第一个位置插入6:";
    25     printDeque(d);
    26     d.insert(d.begin(), 2, 8);//insert(pos,n,elem); 
    27     cout << "在第一个位置插入两个8:";
    28     printDeque(d);
    29     //清除数据
    30     d.clear();//clear(); 
    31     cout << "d清空数据之后:" << endl;
    32     printDeque(d);//打印队列d
    33     deque<int>d1;
    34     for (int i = 0; i < 10; i++) {
    35         d1.push_back(i);
    36     }
    37     cout << "d1:";
    38     printDeque(d1);
    39     d1.insert(d1.begin(), d1.begin() + 3,d1.begin()+5);//insert(pos,beg,end); 
    40     printDeque(d1);
    41     //删除
    42     d1.erase(d1.begin() + 2);//erase(pos); 
    43     printDeque(d1);//打印删除第2个元素后的d1
    44     d1.erase(d1.begin(), d1.end()-1);//erase(beg,end); 
    45     printDeque(d1);//打印删除第1个到倒数第一个元素后的d1
    46     system("pause");
    47     return 0;
    48 }
    deque插入和删除

    运行结果:

     六.数据存取

    函数原型:

    at(int idx); //返回索引idx所指的数据
    operator[]; //返回索引idx所指的数据
    front(); //返回容器中第一个数据元素
    back(); //返回容器中最后一个数据元素

    示例代码:

     1 /*deque数据存取*/
     2 #include<iostream>
     3 #include<deque>
     4 using namespace std;
     5 void printDeque(const deque<int>&d) {
     6     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
     7         cout << *it << " ";
     8     }
     9     cout << endl;
    10 }
    11 int main() {
    12     deque<int>d;
    13     for (int i = 0; i < 10; i++) {
    14         d.push_back(i);
    15     }
    16     printDeque(d);
    17     for (int i = 0; i < 10; i++) {
    18         cout << d[i]<<" ";//at(int idx);
    19     }
    20     cout << endl;
    21     for (int i = 0; i < 10; i++) {
    22         cout << d.at(i) << " ";//operator[]; 
    23     }
    24     cout << endl;
    25     cout << "第一个元素:" << d.front() << endl;//front(); 
    26     cout << "最后一个元素:" << d.back() << endl;//back();
    27     system("pause");
    28     return 0;
    29 }
    deque数据存取

    运行结果:

     七.排序

    函数原型:

    sort(iterator beg, iterator end) ;//对beg和end区间内元素进行排序

    示例代码:

     1 /*deque排序*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<ctime>
     5 #include<deque>
     6 using namespace std;
     7 void printDeque(const deque<int>&d) {
     8     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
     9         cout << *it << " ";
    10     }
    11     cout << endl;
    12 }
    13 int main() {
    14     deque<int>d;
    15     for (int i = 0; i < 10; i++) {
    16         d.push_back(rand());
    17     }
    18     printDeque(d);
    19     //排序
    20     sort(d.begin(),d.end());//sort(iterator beg, iterator end) (默认从小到大排序)
    21     printDeque(d);
    22     system("pause");
    23     return 0;
    24 }
    deque排序

    运行结果:

     八.总结

      操作大多和vector类似,常规操作大概就是以上这些,如有遗漏以后会慢慢补充~

  • 相关阅读:
    poj 3666 Making the Grade
    poj 3186 Treats for the Cows (区间dp)
    hdu 1074 Doing Homework(状压)
    CodeForces 489C Given Length and Sum of Digits...
    CodeForces 163A Substring and Subsequence
    CodeForces 366C Dima and Salad
    CodeForces 180C Letter
    CodeForces
    hdu 2859 Phalanx
    socket接收大数据流
  • 原文地址:https://www.cnblogs.com/chasemeng/p/12825894.html
Copyright © 2011-2022 走看看