C++ STL deque

deque容器基本概念  

  功能:双端数组,可以对头端进行插入删除操作

deque与vector区别:

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

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

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

deque内部工作原理:

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间 

 前或后存入数据满后,开辟新空间,将新空间地址存入中控器,像一片连续内存空间    但同时,插入数据会变快  ,访问时需要访问多个地址,相较vector会慢

deque构造函数   

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <deque>
 4 using namespace std;
 5 //deque容器构造函数
 6 /*     
 7    deque<T>deqT;            //默认构造形式
 8    deque(beg,end);          //构造函数将[beg,end)区间中的元素拷贝给本身
 9    deque(n,elem);           //构造函数将n个elem拷贝给本身
10    deque(const deque& deq); //拷贝构造函数
11 */
12 void printDeque(const deque<int>& d)//加const限定容器只读
13 {
14     //需要一个只读的迭代器  const_iterator       iterator:迭代器
15     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
16     {
17         //*it =100;  容器中数据不可以修改
18         cout << *it <<" ";
19     }
20     cout << endl;
21 }
22 void test()
23 {
24     deque<int>d1;
25     for (int i = 0; i < 10; i++)
26     {
27         d1.push_back(i);
28     }
29     printDeque(d1);// 0 1 2 3 4 5 6 7 8 9
30     deque<int>d2(d1.begin(), d1.end());//区间方式赋值
31     printDeque(d2);// 0 1 2 3 4 5 6 7 8 9    
32     deque<int>d3(10, 100);//n 个 数值
33     printDeque(d3);//100 100 100 100 100 100 100 100 100 100
34     deque<int>d4(d3);//拷贝构造
35     printDeque(d4);//100 100 100 100 100 100 100 100 100 100
36 }
37 int main()
38 {
39     test();
40     system("pause");
41     return 0;
42 }
复制代码

deque赋值操作  

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <deque>   //deque头文件
 4 using namespace std;
 5 //deque赋值操作
 6 /*     
 7    deque& operator=(const deque& deq);   //重载等号操作符
 8    assign(beg, end);                     //将[beg,end)区间中的数据拷贝赋值给本身
 9    assign(n,elem);                       //将n个elem拷贝给本身
10 */
11 void printDeque(const deque<int>& d)//加const限定容器只读
12 {
13     //需要一个只读的迭代器  const_iterator       iterator:迭代器
14     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
15     {
16         //*it =100;  容器中数据不可以修改
17         cout << *it <<" ";
18     }
19     cout << endl;
20 }
21 void test()
22 {
23     deque<int>d1;
24     for (int i = 0; i < 10; i++)
25     {
26         d1.push_back(i);
27     }
28     printDeque(d1);//0 1 2 3 4 5 6 7 8 9 
29     //operator= 赋值
30     deque<int>d2;
31     d2 = d1;
32     printDeque(d2);//0 1 2 3 4 5 6 7 8 9
33     //assign赋值   assign:分派  指定
34     deque<int>d3;
35     d3.assign(d1.begin(), d1.end());
36     printDeque(d3);//0 1 2 3 4 5 6 7 8 9
37     deque<int>d4;
38     d4.assign(10, 100);
39     printDeque(d4);//100 100 100 100 100 100 100 100 100 100
40 }
41 int main()
42 {
43     test();
44     system("pause");
45     return 0;
46 }
复制代码

deque容器的大小操作

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <deque>   //deque头文件
 4 using namespace std;
 5 //deque容器大小进行操作
 6 /*     
 7     deque.empty();          //判断容器是否为空
 8     deque.size();           //返回容器中元素的个数
 9     deque.resize(num);      //重新指定容器的长度为num,若容器变长,则以默认值填充新位置
10                             //如果容器变短,则末尾超出容器长度的元素被删除
11     deque.resize(num,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置
12                             //如果容器变短,则末尾超出容器长度的元素被删除
13 */
14 void printDeque(const deque<int>& d)//加const限定容器只读
15 {
16     //需要一个只读的迭代器  const_iterator       iterator:迭代器
17     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
18     {
19         //*it =100;  容器中数据不可以修改
20         cout << *it <<" ";
21     }
22     cout << endl;
23 }
24 void test()
25 {
26     deque<int>d1;
27     for (int i = 0; i < 10; i++)
28     {
29         d1.push_back(i);
30     }
31     printDeque(d1);//0 1 2 3 4 5 6 7 8 9 
32     if (d1.empty())
33     {
34         cout << "d1为空" << endl;
35     }
36     else
37     {
38         cout << "d1不为空" << endl;
39         cout << "d1的大小为:" << d1.size() << endl;
40         //capacity: deque容器没有容量概念
41     }
42     //重新指定大小
43     //d1.resize(15);  // 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
44     d1.resize(15, 1);
45     printDeque(d1);   // 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
46     d1.resize(5);
47     printDeque(d1);//0 1 2 3 4
48 }
49 int main()
50 {
51     test();
52     system("pause");
53     return 0;
54 }
复制代码

deque插入和删除

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <deque>   //deque头文件
 4 using namespace std;
 5 //deque插入和删除数据
 6 /*     
 7 两端插入操作:
 8     push_back(elem);   //在容器尾部添加一个数据
 9     push_front(elem);  //在容器头部插入一个数据
10     pop_back();        //删除容器最后一个数据
11     pop_front();       //删除容器第一个数据
12 指定位置操作:
13     insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置
14     insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
15     insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值
16     clear();            //清空容器的所有数据
17     erase(beg,end);     //删除[beg,end)区间的数据,返回下一个数据的位置
18     earse(pos);         //删除pos位置的数据,返回下一个数据的位置
19 */
20 void printDeque(const deque<int>& d)//加const限定容器只读
21 {
22     //需要一个只读的迭代器  const_iterator       iterator:迭代器
23     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
24     {
25         //*it =100;  容器中数据不可以修改
26         cout << *it <<" ";
27     }
28     cout << endl;
29 }
30 void test()
31 {
32     deque<int>d1;
33     //尾插
34     d1.push_back(10);
35     d1.push_back(20);
36     //头插
37     d1.push_front(100);
38     d1.push_front(200);
39     printDeque(d1);//200 100 10 20
40     //尾删
41     d1.pop_back();
42     printDeque(d1);//200 100 10
43     //头删
44     d1.pop_front();
45     printDeque(d1);//100 10
46 }
47 void test02()
48 {
49     deque<int>d1;
50     d1.push_back(10);
51     d1.push_back(20);
52     d1.push_front(100);
53     d1.push_front(200);
54     printDeque(d1);//200 100 10 20
55     //insert插入
56     d1.insert(d1.begin(), 1000);
57     printDeque(d1);//1000 200 100 10 20
58     d1.insert(d1.begin(), 2, 10000);
59     printDeque(d1);//10000 10000 1000 200 100 10 20
60     //按照区间进行插入
61     deque<int>d2;
62     d2.push_back(1);
63     d2.push_back(2);
64     d2.push_back(3);
65     d1.insert(d1.begin(), d2.begin(), d2.end());//在d1起始位置插入 d2起始到d2结束
66     printDeque(d1);//1 2 3 10000 10000 1000 200 100 10 20
67 }
68 void test03()
69 {
70     deque<int>d1;
71     d1.push_back(10);
72     d1.push_back(20);
73     d1.push_front(100);
74     d1.push_front(200);
75     //删除
76     deque<int>::iterator it = d1.begin();
77     it++;
78     //200 100 10 20
79     d1.erase(it);//删除 起始+1的数据
80     printDeque(d1);//200 10 20
81     //按照区间方式删除
82     d1.erase(d1.begin(), d1.end());//清空
83     d1.clear();//清空 与上语句等同
84     printDeque(d1);//空白
85 }
86 int main()
87 {
88     //test();
89     //test02();
90     test03();
91     system("pause");
92     return 0;
93 }
复制代码

deque数据存取

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <deque>   //deque头文件
 4 using namespace std;
 5 //deque数据存取
 6 /*     
 7     at(int idx); //返回索引 idx所指的数据
 8     operator[];  //返回索引 idx所致的数据
 9     front();     //返回容器中第一个数据元素
10     back();      //返回容器中最后一个数据元素
11 */
12 void test()
13 {
14     deque<int>d;
15     d.push_back(10);
16     d.push_back(20);
17     d.push_back(30);
18     d.push_front(100);
19     d.push_front(200);
20     d.push_front(300);
21     //通过[]方式访问元素
22     for (int i = 0; i < d.size(); i++)
23     {
24         cout << d[i] << " ";
25     }
26     cout << endl;//300 200 100 10 20 30
27     //通过at方式访问
28     for (int i = 0; i < d.size(); i++)
29     {
30         cout << d.at(i) << " ";
31     }
32     cout << endl;//300 200 100 10 20 30
33     cout << "第一个元素为:" << d.front() << endl;//300
34     cout << "最后一个元素为:" << d.back() << endl;//30
35 }
36 int main()
37 {
38     test();
39     system("pause");
40     return 0;
41 }
复制代码

deque排序操作

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <deque>        //deque头文件
 4 #include <algorithm>    //标准算法头文件 本例中 sort()   algorithm:算法
 5 using namespace std;
 6 //deque排序:利用算法对deque容器进行排序
 7 /*     
 8     sort(iterator begin,iterator end)  //对begin和end区间内元素进行排序
 9 */
10 void printDeque(const deque<int>& d)
11 {
12     for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
13     {
14         cout << *it << " ";
15     }
16     cout << endl;
17 }
18 void test()
19 {
20     deque<int>d;
21     d.push_back(10);
22     d.push_back(20);
23     d.push_back(30);
24     d.push_front(100);
25     d.push_front(200);
26     d.push_front(300);
27     printDeque(d);//300 200 100 10 20 30
28     //排序:默认排序规则  从小到大 升序
29     //对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序
30     //vector容器也可以利用sort进行排序
31     sort(d.begin(), d.end());
32     cout << "排序后" << endl;
33     printDeque(d);//10 20 30 100 200 300
34 }
35 int main()
36 {
37     test();
38     system("pause");
39     return 0;
40 }
复制代码

posted on   廿陆  阅读(8)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示