deque容器
1.简述
deque 是 double-ended queue 的缩写,又叫双端队列容器。
deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。
当需要向序列两端频繁的添加或删除元素时, deque 容器最为合适。
2.头文件
#include<deque>
using namespace std;
3. 创建deque容器
//创建空deque容器
std::deque<int> d;
//创建元素为0(默认)的deque容器
std::deque<int> d(10);
//创建元素为8的deque容器
std::deque<int> d(10, 8) ;
//拷贝deque的方式
std::deque<int> d2(d1);
//拷贝其他类型的容器的方式
int array[] = {1,2,3,4,5};
std::deque<int> d(array, array+5);
std::array<int, 5>array{1, 2, 3, 4, 5};
std::deque<int> d(array.begin()+3, array.end());//{4,5}
4.deque容器的成员函数
1.返回迭代器
//返回第一个元素的迭代器
d.begin();
//返回最后一个元素所在位置的迭代器
d.end();
//返回最后一个元素的迭代器
d.rbegin();
//返回第一个元素所在位置前一个位置的迭代器
d.rend();
//增加const属性,返回第一个元素的迭代器,但是不能修改元素
d.cbegin();
//同上(增加const属性,返回第一个元素的迭代器,但是不能修改元素)
d.crend();
示例
注意寻找合适的迭代器!
例如crbegin()需要和const_reverse_iterator配适
rend()需要和reverse_iterator配适
#include<iostream>//容器
#include<deque>//算法
#include<iterator>//迭代器
using namespace std;
int main()
{
deque<char> v{ 'j','a','v','a' };
deque<char>::const_reverse_iterator rtr;
rtr = v.crbegin();
std::cout << *rtr << endl;
return 0;
}
2.元素个数应用
//返回实际元素个数
d.size();
//返回容器所能容纳元素个数的最大值。这通常是一个很大的值。
d.max_size();
//改变实际元素的个数。
d.resize();
//判断容器中是否有元素,若无元素,则返回 true;反之,返回 false
d.empty();
// 将内存减少到等于当前元素实际所使用的大小。
d.shrink_to_fit();
示例
如果不给初值,char型默认空字符
#include<iostream>//容器
#include<deque>//算法
#include<iterator>//迭代器
int main()
{
deque<char> v{ 'c','p','p' };
deque<char>::iterator rtr;
v.resize(8);
cout << v.size() << endl;
v.pop_front();
cout << v.size() << endl;
cout << v.front() << endl;
return 0;
}
3.返回元素的引用
//返回第一个元素的引用。
d.front();
//返回最后一个元素的引用。
d.back();
示例
#include<iostream>//容器
#include<deque>//算法
#include<iterator>//迭代器
using namespace std;
int main()
{
deque<int> a = { 1,2,3,4,5 };
int& b = a.front();
b = 100;
cout << b << endl; //b=100
cout << a.front() << endl; //a.front()=100
int c = a.back();
c = 50;
cout << c << endl; //c=50
cout << a.back() << endl; //a.back()=9
4. 增添,删除,替换
//用新元素替换原有内容。
d.assign();
//在序列的尾部添加一个元素。
d.push_back();
//在序列的头部添加一个元素。
d.push_front();
//移除容器尾部的元素。
d.pop_back();
//移除容器头部的元素。
d.pop_front();
//在指定的位置插入一个或多个元素。
d.insert();
//移除一个元素或一段元素。
d.erase();
//移出所有的元素,容器大小变为 0。
d.clear();
//交换两个容器的所有元素。
d.swap();
示例
注意函数的参数代表的含义
#include<iostream>//容器
#include<deque>//算法
#include<iterator>//迭代器
using namespace std;
int main()
{
deque<int> v1(10);
deque<int> v2{ 10, 20 };
v1.assign(v2.begin(), v2.end());
cout << v1.size() << endl;
//
deque<int> v1(10);
deque<int> v2{ 10, 20 };
int b[10] = { 0 };
v1.insert(v1.begin(), 3, 5);
v2.insert(v2.begin(), b + 1, b + 6);
//
deque<int> v1(10,3);
deque<int> v2{ 10, 20 };
deque<int>::iterator it;
v1.swap(v2);
it = v1.begin();
cout << *it << endl;
}
5.
//在指定的位置直接生成一个元素。
d.emplace();
//在容器头部生成一个元素。和 push_front() 的区别是,该函数直接在容器头部构造元素,省去了复制移动元素的过程。
d.emplace_front();
//在容器尾部生成一个元素
d.emplace_back();
示例
注意deque v1(10);默认元素值为0
#include<iostream>//容器
#include<deque>//算法
#include<iterator>//迭代器
using namespace std;
int main()
{
deque<int> v1;
deque<int>::iterator it;
v1.emplace_front();
it = v1.begin();
cout << *it << endl;
}