C++ STL deque介绍与使用方法

本文详细介绍了双端队列(deque)的概念与使用方法,包括其构造函数、迭代器、容器大小函数、元素访问及修改等操作。双端队列是一种结合了队列和序列容器特性的数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

deque(双端队列)

双端队列可以看成是在队列的基础上进行了扩展,我们知道队列的操作只能是在头尾,并且出队列只能是在头部,入队列只能是在尾部。同时双端队列又是顺序容器,因此可以随机访问每个元素。所以,双端队列综合了队列与序列容器的共同特点。

虽然deque是序列容器,但它与vector内部结构又完全不相同,vector内部是一个简单数组,如果需要更大的空间则重新分配内存,然后拷贝过去。deque内不是动态数组,如果需要需要更大空间,则再分配一块内存,添加到之前的后面,所以deque内部的数据时存储在好几块内存区,而并不是连续的。

头文件:#include
构造函数
// constructors used in the same order as described above:
std::deque<int> first;                                // empty deque of ints
std::deque<int> second (4,100);                       // four ints with value 100
std::deque<int> third (second.begin(),second.end());  // iterating through second
std::deque<int> fourth (third);                       // a copy of third

// the iterator constructor can be used to copy arrays:
int myints[] = {16,2,77,29};
std::deque<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

std::cout << "The contents of fifth are:";
for (std::deque<int>::iterator it = fifth.begin(); it!=fifth.end(); ++it)
std::cout << ' ' << *it;
迭代器
std::deque<int> first;                                // empty deque of ints
std::deque<int> second(4, 100);                       // four ints with value 100

deque<int>::iterator it;
it = first.begin();
it = first.end();

容器大小函数

std::deque<int> first;                                // empty deque of ints
std::deque<int> second(4, 100);                       // four ints with value 100

cout << second.size() << endl;    //deque元素个数
cout << second.empty() << endl;   //deque是否为空
second.resize(10);            //重新设置大小,这时size()函数返回10,并且原来的值不改变,多于的空间内存初始化为0
second.shrink_to_fit();  //由于deque有预留空间,因此调用这个函数可以压缩占用空间


元素访问
int myints[] = { 16, 2, 77, 29 };
std::deque<int> fifth(myints, myints + sizeof(myints) / sizeof(int));

//同时拥有序列容器与队列的访问方式
cout << fifth[1] << endl;
cout << fifth.at(1) << endl;
cout << fifth.front() << endl;
cout << fifth.back() << endl;
元素修改
int myints[] = { 16, 2, 77, 29 };
std::deque<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
deque<int> second(myints, myints+2);

//插入位置必须是要通过Itertor指定
vector<int> myvector(3, 400);

fifth.insert(fifth.begin(), 300);
fifth.insert(fifth.begin(), myvector.begin(), myvector.end());

fifth.erase(fifth.begin());  //删除第一个元素
fifth.erase(fifth.begin(), fifth.begin() + 3);  //删除头三个元素

fifth.swap(second);
fifth.clear();   //清空元素

fifth.emplace(fifth.begin(), 20);

在C++11里面,很多容器都添加了emplace相关的函数,从功能上讲,emplace与insert基本一致,都是向容器中插入元素。但是,调用insert时,我们将元素类型的对象传递给insert,元素的对象被拷贝到容器中,而当我们使用emplace时,我们将参数传递给元素类型的构造函数,emplace使用这些参数在容器管理的内存空间中直接构造元素。所以,两者的主要区别是执行效率上,emplace执行效率更高,但对于大多数程序来讲,这点应该影响不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值