STL之deque学习总结(C++)
STL之deque用法
概述
- STL提供3种顺序容器:vector、list、deque。vector和deque都是基于数组的,list实现链表数据结构。
- deque是double-ended queue(双头队列)。deque类在一个容器中提供了vector和list的许多好处。
- deque类能利用下标提供有效的索引访问,可以像vector一样读取与修改元素,还像list一样能有效地在前面和后面进行插入和删除操作。
- 需要增加deque的存储空间时,可以在内存块中deque两端进行分配,通常保存为这些块的指针数组。
- 对deque分配存储块之后,有些版本要删除deque时才释放这个块,这样使deque比重复分配、释放和再分配内存块时更加有效,但也更浪费内存。
- deque利用非连续内存布局,因此deque迭代器比vector和基于指针的数组中用于迭代的指针更加智能化。
- deque支持随机访问迭代器,即list可以使用下表内所有的迭代器操作。
具体用法
0. 头文件
#include<deque>
1. 声明和初始化
//声明list类的实例list1,存放int值,生成了一个长度为0的空list,容量capacity为0
deque<int>de;
//声明一个list类型的二维链表list1
deque<deque<int>>de;
//声明一个list类型的一维链表list1,并将{1,2,3,4}赋值给list1
deque<int>de = { 1,2,3,4 };
//生成一个链表list1,将list2复制给list1
deque<int>de = de1;
或 deque<int>de(de1);
或 deque<int>de(de1.begin(), de1.end());
//生成一个链表list1,将数组a的a[0]到a[4]的内容复制给list1
deque<int>de(a, a + 5);
或 deque<int>de(&a[0], &a[4]);
//生成一个链表list1,将大小设为10,且每个元素都为设置为0(默认)
deque<int>de(10);
//生成一个链表list1,将大小设为10,且每个元素都为设置为5
deque<int>de(10, 5);
//将list1清空,然后添加2个元素,每个元素都赋值为10
de.assign(2, 10);
//声明二维链表list1,将两个一维链表赋值给list1
deque<deque<int>>de;
deque<int>de1 = { 1,2,3,4 };
deque<int>de2 = { 2,4,6,8 };
de.push_back(de1);
de.push_back(de2);
2. 常用函数(查询)
2.1 empty()
de.empty(); //返回值bool类型,若de为空,则返回true
2.2 size()
de.size(); //返回值为int类型,de当前存放的元素的个数
2.3 front()
条件:de不能为空,否则de.front()结果是未定义!
de.front(); //返回de最前面的元素,即de[0]
2.4 back()
条件:de不能为空,否则de.back()结果是未定义!
de.back(); //返回de最末尾的元素,即de[de.size()-1]
2.5 迭代器
deque的迭代器通常实现为deque元素的指针。
//开始指针(正向)
de.begin()
//结束指针(正向),指向de最后一个元素的后一位
de.end()
//开始指针(逆向)
de.rbegin()
//结束指针(逆向),指向de最后一个元素的后一位
de.rend()
//常量开始指针(正向),不能通过该指针来修改所指内容
de.cbegin()
//常量结束指针(正向),不能通过该指针来修改所指内容,指向de最后一个元素的后一位
de.cend()
2.6 输出
//迭代器,顺序访问
for (deque<int>::iterator p = nums.begin(); p != nums.end(); p++)
cout << *p << " ";
//输出迭代器,copy算法
ostream_iterator<int> output(cout, " ");
copy(de.begin(),de.end(),output);
cout<<endl;
//迭代器,逆序访问
for (deque<int>::reverse_iterator p = nums.rbegin(); p != nums.rend(); p++)
cout << *p << " ";
//若是二维deque,注意传入参数是按值传递(不是&nums)因此在函数里对向量的修改不影响真正的向量的元素。顺序访问
void display_deque_two(deque<deque<int>> nums) {
while (!nums.empty()) {
for (deque<int>::iterator p = nums.front().begin(); p != nums.front().end(); p++)
cout << *p << " ";
cout << endl;
nums.erase(nums.begin());
}
}
//还有一个基础的类似二维数组a[ ][ ]的输出方法,用下标运算符[ ]来输出,顺序访问
void display_deque_two(deque<deque<int>> nums) {
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums[i].size(); j++) {
cout << nums[i][j] << " ";
}
cout << endl;
}
}
3. 常用函数(操作)
3.1 push_back()
//在de末尾添加元素2
de.push_back(2);
3.2 push_front()
//在de开头添加元素3
de.push_front(3);
3.3 pop_front()
//删除de开头元素
de.pop_front();
3.4 pop_back()
//删除de末尾元素
de.pop_back();
3.5 assign()
//将de清空,然后将de1元素从头到尾复制给de
de.assign(de1.begin(), de1.end());
//将de清空,然后添加2个元素,每个元素都赋值为10
de.assign(2, 10);
3.6 insert()
//在de开头前插入10
de.insert(de.begin(),10);
//在de后插入de1的从头开始往后的共3个元素
de.insert(de.end(), de1.begin(), de1.begin() + 3);
3.7 erase()
//删除de头部的元素
de.erase(de.begin());
//删除list1从头开始往后的3个元素
de.erase(de.begin(), de.begin()+3);
3.8 swap()
//将list1和list2交换
de.swap(de1);
3.9 resize()
//重置向量的大小为10
de.resize(10);
3.10 clear()
//清空向量
de.clear();
4. 常用算法
4.0 头文件
#include<algorithm>
4.1 copy()
//将de1从头到尾的内容复制给de
copy(de1.begin(),de1.end(),de);