• 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类似,常规操作大概就是以上这些,如有遗漏以后会慢慢补充~

  • 相关阅读:
    C语言32个关键字详解
    C语言格式控制符
    c++关键字详解
    多码流简介
    Jtag管脚定义
    关于RGB信号的电平
    缩略语MSPS
    【转】松下18650的容量判别方法
    电信号在FR4材料中的传播速度
    dropout voltage
  • 原文地址:https://www.cnblogs.com/chasemeng/p/12825894.html
Copyright © 2020-2023  润新知