详解c++STL—容器deque
详解c++STL库中的容器deque—双端数组
·
目录
1、deque容器的基本概念
1.1、功能
- 双端数组,可以对头端进行插入删除操作
1.2、deque与vector区别
- vector对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度回比vector快
- vector访问元素时的速度会比deque快,这和两者内部实现有关
1.3、deque内部工作原理
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
deque容器的迭代器也是支持随机访问的
2、deque构造函数
2.1、功能描述
- deque容器构造
2.2、函数原型
- deque<T> deqT; //默认构造形式
- deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。
- deque(n, elem); //构造函数将n个elem拷贝给本身。
- deque(const deque &deq); //拷贝构造函数
2.3、示例
//deque构造函数
void myprint(const deque<int> d) {
for (deque<int>::const_iterator it = d.begin(); it != d.end();it++) {
/**it = 10;*/
cout << *it << " ";
}
cout << endl;
}
void test01() {
//1、默认构造
deque<int> d;
for (int i = 0; i < 10; i++) {
d.push_back(i);
}
myprint(d);
//2、区间构造
deque<int> d1(d.begin(),d.end());
myprint(d1);
//3、n个elem构造
deque<int> d2(10,100);
myprint(d2);
//4、拷贝构造
deque<int> d3(d2);
myprint(d3);
}
int main() {
test01();
system("pause");
return 0;
}
3、deque赋值操作
3.1、功能描述
- 给deque容器进行赋值
3.2、函数原型
- deque& operator=(const deque &deq); //重载等号操作符
- assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
- assign(n, elem); //将n个elem拷贝赋值给本身。
3.3、示例
//deque赋值
void myprint(const deque<int> d) {
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
/**it = 10;*/
cout << *it << " ";
}
cout << endl;
}
void test01() {
deque<int> d;
for (int i = 0; i < 10; i++) {
d.push_back(i);
}
myprint(d);
//1、等号赋值
deque<int> d1;
d1 = d;
myprint(d1);
//2、assign区间赋值
deque<int> d2;
d2.assign(d1.begin(),d1.end());
myprint(d2);
//3、assign,n个elem赋值
deque<int> d3;
d3.assign(10,100);
myprint(d3);
}
int main() {
test01();
system("pause");
return 0;
}
4、deque大小操作
4.1、功能描述
- 对deque容器的大小进行操作
4.2、函数原型
- deque.empty(); //判断容器是否为空
- deque.size(); //返回容器中元素的个数
- deque.resize(num);
- //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
- deque.resize(num, elem);
- //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
4.3、示例
//deque大小操作
void myprint(const deque<int> d) {
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
deque<int> d;
for (int i = 0; i < 10; i++) {
d.push_back(i);
}
myprint(d);
//1、判断是否为空
if (d.empty()) {
cout << "d,为空" << endl;
}
else {
cout << "d,不为空" << endl;
//2、输出容器大小
cout << "d,大小为:" << d.size() << endl;
}
//3、改变大小,空缺默认用0填充
d.resize(15);
myprint(d);
//4、改变大小,设定空缺用1填充
d.resize(20,1);
myprint(d);
//5、改变大小,过小发生截断
d.resize(5);
myprint(d);
}
int main() {
test01();
system("pause");
return 0;
}
注意:deque没有容量的概念
5、deque插入和删除
5.1、 功能描述
- 向deque容器中插入和删除数据
5.2、函数原型
两端插入操作:
- 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位置的数据,返回下一个数据的位置。
5.3、示例
//deque大小操作
void myPrint(const deque<int> d) {
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//两端操作
void test01() {
deque<int> d;
//尾插尾删
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.pop_back();
myPrint(d);
//头插头删
d.push_front(40);
d.push_front(50);
d.push_front(60);
d.pop_front();
myPrint(d);
}
//指定位置操作
void test02() {
deque<int> d1;
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
d1.push_back(40);
myPrint(d1);
//1、指定位置插入一个值
d1.insert(d1.begin(),50);
myPrint(d1);
//2、指定位置插入多个相同值
d1.insert(d1.end(), 2, 60);
myPrint(d1);
//3、指定位置插入一个区间
deque<int> d2;
d2.push_back(1);
d2.push_back(2);
d2.push_back(3);
d1.insert(d1.begin(),d2.begin(),d2.end());
myPrint(d1);
}
//删除操作
void test03() {
deque<int> d1;
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
d1.push_back(40);
myPrint(d1);
//1、指定位置删除,返回下一个数据的位置
d1.erase(d1.begin());
myPrint(d1);
//2、指定区间删除,返回下一个数据的位置
//如果区间为【begin,end】,等价于 clear()
d1.erase(d1.begin(),d1.end());
myPrint(d1);
//3、清空
d1.clear();
myPrint(d1);
}
int main() {
//test01();
//test02();
test03();
system("pause");
return 0;
}
6、deque数据存取
6.1、功能描述
- 对deque 中的数据的存取操作
6.2、函数原型
- at(int idx); //返回索引idx所指的数据
- operator[]; //返回索引idx所指的数据
- front(); //返回容器中第一个数据元素
- back(); //返回容器中最后一个数据元素
6.3、示例
//deque容器的存取
void test01() {
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_back(40);
d.push_back(50);
//1、[]存取
for (int i = 0; i < d.size();i++) {
cout << d[i] << " ";
}
cout << endl;
//2、at()存取
for (int i = 0; i < d.size(); i++) {
cout << d.at(i) << " ";
}
cout << endl;
//3、front(),返回第一个
int ret = d.front();
cout << ret << endl;
//4、back(),返回最后一个
ret = d.back();
cout << ret << endl;
}
int main() {
test01();
}
7、deque排序
7.1、功能描述
- 利用算法实现对deque容器进行排序
7.2、算法
- sort(iterator beg, iterator end); //对beg和end区间内元素进行排序
7.3、示例
//deque容器的存取
void myPrint(const deque<int> d) {
for(int i = 0; i < d.size(); i++) {
cout << d[i] << " ";
}
cout << endl;
}
void test01() {
deque<int> d;
d.push_back(50);
d.push_back(40);
d.push_back(30);
d.push_back(20);
d.push_back(10);
cout << "排序前:";
myPrint(d);
//默认升序
sort(d.begin(),d.end());
cout << "排序后:";
myPrint(d);
}
int main() {
test01();
}
注意事项:
1、sort()默认升序排序
2、对于支持随机访问的迭代器的容器,都可以用sort()排序,如vector
3、使用sort()时,需要包含头文件<algorithm>
更多推荐
已为社区贡献2条内容
所有评论(0)