deque容器属于双端数组,可以队它的头部和尾部进行插入数据的操作,在我们是使用vector的时候,对于头部的插入删除效率很低,当数据量很大的时候,这一点就表现得越发的明显,而相对而言deque对头部的插入删除速度就比vector快很多,但是vector访问元素的速度会比deque访问元素的速度快很多,这和他们的内部实现有关系.下图就很好展现了deque的特性
deque<int> dq; // 定义一个int类型的双端队列dq
deque<int> dq(10); // 定义一个int类型的双端队列dq,并设置初始大小为10
deque<int> dq(10, 20); // 定义一个int类型的双端队列dq,并设置初始大小为10且初始值都为20
deque<int> dq1(dq); // 定义并用双端队列dq初始化双端队列dq1
deque<int> dq1(dq.begin(), a.begin()+3); // 将双端队列dq中从第0个到第2个(共3个)作为双端队列dq1的初始值
deque<int> dq; // 定义一个int类型的双端队列dq
deque <int> dq1 = dq;
-deque插入元素
头部添加元素:dq.push_front(const T& x);
末尾添加元素:dq.push_back(const T& x);
任意位置插入一个元素:dq.insert(iterator it, const T& x);
任意位置插入 n 个相同元素:dq.insert(iterator it, int n, const T& x);
插入另一个向量的 [first,last] 间的数据:deq.insert(iterator it, iterator first, iterator last);
deque 删除元素
头部删除元素:dq.pop_front();
末尾删除元素:dq.pop_back();
任意位置删除一个元素:dq.erase(iterator it);
删除 [first,last] 之间的元素:dq.erase(iterator first, iterator last);
清空所有元素:dq.clear();
deque交换两个同类型容器的元素:
swap(deque&);
常用到的方法
assign() 它分配新内容并替换旧内容。
emplace() 它将在指定位置添加一个新元素。
emplace_back() 它在末尾添加一个新元素。
emplace_front() 它在双端队列的开头添加一个新元素。
insert() 它在指定位置之前添加一个新元素。
push_back() 它在容器的末尾添加一个新元素。
push_front() 它在容器的开头添加一个新元素。
pop_back() 它从双端队列中删除最后一个元素。
pop_front() 它从双端队列中删除第一个元素。
swap() 它交换两个双端队列的内容。
clear() 它将删除双端队列的所有内容。
empty() 它检查容器是否为空。
erase() 它删除元素。
max_size() 它确定双端队列的最大大小。
resize() 它改变了双端队列的大小。
shrink_to_fit() 它减少了内存以适合双端队列的大小。
size() 它返回元素数。
at() 它访问位置pos处的元素。
operator[]() 它访问位置pos处的元素。
operator=() 它将新的内容分配给容器。
back() 它访问最后一个元素。
begin() 它将迭代器返回到双端队列的开头。
cbegin() 它向双端队列的开头返回一个常量迭代器。
end() 它将迭代器返回到末尾。
cend() 它将常量迭代器返回到末尾。
rbegin() 它将反向迭代器返回到开头。
crbegin() 它将常量反向迭代器返回到开头。
rend() 它将反向迭代器返回到末尾。
crend() 它将常量反向迭代器返回到末尾。
front() 它访问最后一个元素。
验证代码
#include
#include
#include
#include
using namespace std;
class Person{
public:
Person(string nam,int ag)
{
this->name = nam;
this->age = ag;
}
string name;
int age;
};
void print(deque <Person> &p)
{
for(deque<Person>::iterator it = p.begin();it != p.end();it++)
{
cout << "name: "<< it->name <<" age: " << it->age<< endl;
}
}
void test01(void)
{
Person p1("张三",25);
Person p2("李四",21);
Person p3("王五",29);
Person p4("刘二",22);
Person p5("周八",23);
Person p6("孙六",28);
deque<Person> dq;
dq.push_back(p1);
dq.push_back(p2);
dq.push_back(p3);
dq.push_back(p4);
dq.push_back(p5);
dq.push_back(p6);
cout << "dq: " << endl;
print(dq);
cout << "dq size: " << dq.size() <<endl;
cout << "dq max size" << dq.max_size() << endl;
cout << "[] 访问:" << dq[0].name << dq[0].age << endl;
cout << "insert后:" << endl;
deque<Person>::iterator it = dq.begin();
dq.insert(it+3,p1);
print(dq);
cout << "insert 4个p1后:" << endl;
dq.insert(it+3,4,p1);
print(dq);
cout << " push front p4 后: "<< endl;
dq.push_front(p4);
print(dq);
deque<Person> dq1 = dq;
cout << "dq1: "<<endl;
print(dq1);
cout << "dq1 size: " << dq1.size() <<endl;
deque <Person> dq2(6,p1);
cout << "dq2: "<<endl;
print(dq2);
cout << "dq2 size: " << dq2.size() <<endl;
cout << "/n assign dq3:" << endl;
deque <Person> dq3(dq.begin(),dq.end());
print(dq3);
cout << "/n assign(n,elm) dq4:" << endl;
deque <Person> dq4;
dq4.assign(3,p3);
print(dq4);
cout << "pop front 操作"<<endl;
dq.pop_front();
print(dq);
cout << "pop back 操作"<<endl;
dq.pop_back();
print(dq);
}
void print02(deque<int> &p)
{
for(deque<int>::iterator it = p.begin();it != p.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test02(void)
{
deque<int> dq;
for(int i = 0;i < 5; i++)
{
dq.push_front(i);
}
print02(dq);
deque<int> dq1;
for(int i = 0;i < 5; i++)
{
dq1.push_back(i);
}
cout << "dq1: "<<endl;
print02(dq1);
cout << "dq1 swap dq 后:"<<endl;
dq1.swap(dq);
print02(dq1);
}
int main(void)
{
test01();
test02();
return 0;
}