STL-deque容器
【摘要】 deque容器基本概念Double ended queue的简称双端数据,可以对头端进行插入删除操作deque容器的迭代器也是支持随机访问的deque与vector区别:vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度比vector快vector访问元素时的速度会比deque快,这和两者内部实现有关deque内部工作原理:deque内部有一...
deque容器基本概念
Double ended queue
的简称
双端数据,可以对头端进行插入删除操作
- deque容器的迭代器也是支持随机访问的
deque与vector区别:
- vector对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度比vector快
- vector访问元素时的速度会比deque快,这和两者内部实现有关
deque内部工作原理:
- deque内部有一个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据
- 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
deque构造函数
deque<T>deqT;
//默认构造deque(beg, end);
//构造函数将[beg,end)区间内的元素拷贝给自身deque(n, ele);
//构造函数将n个ele拷贝给自身deque(const deque& deq);
//拷贝构造函数
如果要限制一个容器为只读状态,那么他的迭代器也要发生改变
#include <iostream>
#include<deque>
using namespace std;
//加const,限定只读
void Print(const deque<int>& d)
{
//需要一个只读迭代器,否则会报错:不存在适当转换
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
//*it = 10;容器中的数据不可以修改了
cout << *it << endl;
}
}
int main()
{
deque<int>d(10, 9);
Print(d);
return 0;
}
deque赋值操作
重载=运算符:
deque& operator=(const deque& deq);
assign方式赋值:
.assign(beg, end);
//将[beg,end)区间内的数据拷贝赋值给自身.assign(n, elem);
//将n个elem拷贝赋值给自身
deque复制操作与vector相同,需要熟练掌握
#include <iostream>
#include<deque>
using namespace std;
void Print(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int>d1(10, 9);
//operator=赋值
deque<int>d2;
d2 = d1;
Print(d2);
//assign赋值
deque<int>d3;
d3.assign(d1.begin(), d1.end());
Print(d3);
d3.assign(2, 3);
Print(d3);
return 0;
}
deque大小操作
.empty();
//判断容器是否为空.size();
//返回容器中元素的个数.resize(int num);
//重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;如果容器变短,则末尾超出容器长度的元素被删除.resize(int num, elem);
//重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
注意与vector的区别:
- 没有
.capacity()
“容量”,因为内部结构没有容量限制,可以无限扩展
deque<int>d(10, 9);
cout << d.size() << endl;//10
d.resize(3);
cout << d.size() << endl;//3
cout << d.empty() << endl;//0
总结:
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();
//清空容器内所有数据.eraser(beg,end);
//删除[beg,end)区间的数据,返回下一个数据的位置.erase(pos);
//删除pos位置的数据,返回下一个数据的位置
注意:
- 插入和删除提供的位置是迭代器
#include <iostream>
#include<deque>
using namespace std;
void Print(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int>d;
cout << *d.insert(d.begin(), 1) << endl;
d.insert(d.begin(), d.begin(), d.end());
d.insert(d.begin(), 2, 2);
Print(d);
//删除
deque<int>::iterator it = d.begin();
it += 2;//指向第三个元素
d.erase(d.begin()+2);
Print(d);
return 0;
}
deque数据存取
.at(int idx);
//返回索引idx
所指的数据operator[];
//返回索引idx
所指的数据.front();
//返回容器中第一个元素的数据.back();
//返回容器中最后一个元素的数据
deque<int>d;
for (int i = 0; i < 10; i++)
{
//不能用下标或at添加新元素
d.push_back(i);
}
for (int i = 0; i < 10; i++)
{
cout << d[i] << " ";
}
cout << endl << d.front() << d.back() << endl;
deque排序操作
sort(iterator beg, iterator end);
//对beg和end区间内的元素进行排序
- 默认的排序规则是升序:从小到大,
- 对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其排序
- voctor容器也可以使用sort排序
sort算法非常实用,使用时包含头文件algorithm
即可
#include <iostream>
#include<deque>
#include<algorithm>
using namespace std;
void Print(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int>d;
for (int i = 0; i < 10; i++)
{
d.push_back(20-i);
}
Print(d);
sort(d.begin(), d.end());
Print(d);
return 0;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)