deque 是 double-ended queue 的缩写,又称双端队列容器。deque容器支持从头部和尾部双端插入、删除数据。与vector容器不同的是,vector容器是一段连续的空间,而deque没有所谓容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。不会像vector那样,因为空间不足而扩容,复制元素到新的空间,再释放旧的空间。因此deque没有必要提供所谓的扩容(reserve)的功能。
deque容器可以看做是一个双端数组,可以从头或者尾之间插入数据。从头插入或者删除使用push_front和pop_front。从尾插入或删除输出使用push_backh和pop_back。从任意位置插入可以使用insert函数。
deque容器,在空间管理上是通过内部中控器来实现的。中控器记录每一个缓冲区的地址。缓冲区中存放真实的数据内容。因而在deque容器中,数据空间是由多段空间组成的。
deque容器是没有预留空间函数reserve和获取容量大小函数capacity。
deque从头端插入数据比vector容器快,而且数据量越大越明显。
deque容器的构造函数和vector类似,由无参构造、有参构造、拷贝构造。
deque构造函数:
deque() --无参构造
deque(begin,end);//有参构造,将begin~end之间的数据拷贝
deque(int count,elem);//count个elem数据
deque(deque &p);//拷贝构造
应用示例:
#include < iostream >
using namespace std;
#include < deque >
#include < algorithm >
void PrintDeque(const deque< int >& p)
{
for (deque< int >::const_iterator deq = p.begin(); deq != p.end(); deq++)
{
cout < < *deq < < " ";
}
cout < < endl;
}
void Print(int val)
{
cout < < val < < " ";
}
void test()
{
//创建一个deque容器
deque< int > deq;
//插入数据:尾插
deq.push_back(1);
deq.push_back(2);
deq.push_back(3);
//插入数据:头插
deq.push_front(4);
deq.push_front(5);
deq.push_front(6);
cout < < "第一个数据:" < < deq.front() < < endl;
cout < < "最后一个数据:" < < deq.back() < < endl;
cout < < "遍历:" < < endl;
PrintDeque(deq);
cout < < "for_each逆向遍历:" < < endl;
for_each(deq.rbegin(), deq.rend(), Print);
cout < < endl;
cout < < "有参构造:" < < endl;
deque< int > deq2(deq.rbegin(), deq.rend());//区间赋值
PrintDeque(deq2);
deque< int > deq3(3, 666);//赋值3个666
PrintDeque(deq3);
cout < < "拷贝构造:"< < endl;
deque< int > deq4(deq);//拷贝构造
PrintDeque(deq4);
}
int main()
{
test();
system("pause");
}
赋值方式可以直接使用“=”赋值,也可以通过函数assign实现。
deq赋值:
重载"=":operator=();
assign(begin,end);//区间赋值
assign(int count,elem);//count个elem
使用示例:
include < iostream >
#include < deque >
using namespace std;
void PrintDeque(const deque< int >& p)
{
for (deque< int >::const_iterator deq = p.begin(); deq != p.end(); deq++)
{
cout < < *deq < < " ";
}
cout < < endl;
}
void test()
{
deque< int > deq;
//尾插
deq.push_back(1);
deq.push_back(2);
deq.push_back(3);
//头插
deq.push_front(4);
deq.push_front(5);
deq.push_front(6);
cout < < "deq 直接插入" < < endl;
PrintDeque(deq);
deque< int > deq2 = deq;//之间赋值
cout < < "deq2 =赋值" < < endl;
PrintDeque(deq2);
cout < < "deq3 区间赋值" < < endl;
deque< int > deq3;
deq3.assign(deq.begin(), deq.end());
PrintDeque(deq3);
}
int main()
{
test();
system("pause");
}
判断容器是否为空可以使用empty()函数,设置元素个数可以使用resize()函数,获取元素个数使用size()函数。
deque容器获取大小:
判断容器是否为空:empty() ---为空返回true
获取容器元素个数:size()
指定容器大小:resize(int num);
resize(int num,elem);//指定大小,超出部分用elem填充
resize指定大小,若小于则会将超出部分删除
注意:
deque容器没有获取容量函数capacity()
使用示例:
#include < iostream >
using namespace std;
#include < deque >
void PrintDeque(deque< string >& p)
{
for (deque< string >::iterator deq = p.begin(); deq != p.end(); deq++)
{
cout < < *deq < < " ";
}
cout < < endl;
}
void test()
{
deque< string > deq;
deq.push_back("hello");
deq.push_back("学习");
deq.push_back("c++");
deq.push_back("deque容器");
deq.push_back("使用");
deq.push_back("示例");
PrintDeque(deq);
cout < < "元素个数:" < < deq.size() < < endl;
deq.resize(10,"c++");//指定个数,剩余填充"c++";
PrintDeque(deq);
deq.resize(3);
PrintDeque(deq);
cout < < "元素个数:" < < deq.size() < < endl;
}
int main()
{
test();
system("pause");
}
deque容器是双端性质的,所以可以从头端或者尾端插入数据。相关函数如下:
deque容器插入与删除:
push_back、pop_back --尾插和尾删
push_front、pop_front --头插和头删除
insert(pos,elem); --pos是一个迭代器,在pos位置插入elem,返回新数据位置
insert(pos,n,elem); ---在pos位置插入n个elem,无返回值
insert(pos,begin,end); --在pos位置插入begin~endl的数据,无返回值
clear() --清空整个deque容器
erase(begin,end); --删除begin~end之间的数,返回下一个数据位置
erase(pos) --删除指定位置的数
使用示例:
#include < iostream >
using namespace std;
#include < deque >
void PrintDeque(deque< int >& deq)
{
for (deque< int >::iterator p = deq.begin(); p != deq.end(); p++)
{
cout < < *p < < " ";
}
cout < < endl;
}
void test()
{
deque< int > deq;
//头插
deq.push_front(1);
deq.push_front(2);
deq.push_front(3);
//尾插
deq.push_back(4);
deq.push_back(5);
deq.push_back(6);
cout < < "t插入数据示例:" < < endl;;
PrintDeque(deq);
deq.pop_back();//尾删
deq.pop_front();//头删
cout < < "t删除数据示例:" < < endl;;
PrintDeque(deq);
cout < < "tinsert插入数据示例:" < < endl;
deq.insert(deq.begin() + 2, 666);//在起始的第二个位置插入666
deq.insert(deq.begin() + 5, 3, 888);//在起始的第5个位置插入三个888
PrintDeque(deq);
deque< int > deq2;
cout < < "tinsert区间插入数据示例:" < < endl;
deq2.insert(deq2.begin(), deq.begin() + 5, deq.begin() + 8);//在deq2的起始位置插入deq的第5~8个位置的数
PrintDeque(deq2);
//删除数据
cout < < "指定位置删除:" < < endl;
deq.erase(deq.begin() + 2);//删除第2个位置的数
PrintDeque(deq);
cout < < "指定区间删除:" < < endl;
deq.erase(deq.begin() + 3, deq.begin() + 6);//删除第3~6位置上的数
PrintDeque(deq);
cout < < "清空:" < < endl;
deq2.clear();
PrintDeque(deq2);
}
int main()
{
test();
system("pause");
}
deque可以通过[]读写数据,也可以通过函数at()来实现。
deque容器数据存取:
重载[]:operator[]()
at(pos);
获取第一个成员:front
获取最后一个成员:back
第一个成员的前一个位置:rend
最后一个成员的下一个位置:end
使用示例:
#include < iostream >
using namespace std;
#include < deque >
#include < algorithm >
void test()
{
deque< string > deq;
deq.push_back("hello");
deq.push_back("c++");
deq.push_back("学习");
deq.push_back("示例");
cout < < "最后一个成员:" < < deq.back() < < endl;
cout < < "第一成员:" < < deq.front() < < endl;
cout< <"遍历:"< ;>
7.排序
可以使用sort函数对成员进行排序。该函数的头文件是algorithm。
排序:sort(iterator begin,iterator end);//默认是升序
使用示例:
#include < iostream >
#include < string >
#include < algorithm >
#include < deque >
using namespace std;
void test()
{
string str = "hello,world";
sort(str.begin(), str.end());
cout < < str < < endl;
deque< int > deq;
deq.push_back(0);
deq.push_back(2);
deq.push_back(1);
deq.push_front(4);
deq.push_front(5);
deq.push_front(6);
cout < < "原内容:" < < endl;
for (int i = 0; i < deq.size(); i++)
{
cout < < deq[i] < < " ";
}
cout < < endl;
cout < < "排序后:" < < endl;
sort(deq.begin(), deq.end());
for (int i = 0; i < deq.size(); i++)
{
cout < < deq[i] < < " ";
}
cout < < endl;
cout < < "数组排序:" < < endl;
int buff[] = { 1,2,3,6,4,0,8,7,2 };
sort(buff, buff+ sizeof(buff) / sizeof(int));
for (int i = 0; i < sizeof(buff) / sizeof(int); i++)
{
cout < < buff[i] < < " ";
}
}
int main()
{
test();
system("pause");
}
全部0条评论
快来发表一下你的评论吧 !