【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
Deque和vector很像,区别是deque可以在两头插入和删除。
要使用deque,需加上头文件:
#include <deque>
一、Abilities of Deque
1.deque与vector的不同之处
- 在头尾插入和移除元素都很快
- 访问元素的内部结构更加间接,因此访问和移动稍慢
- Iterator必需是smart pointer而不是ordinary pointer,因为要在不同blocks之间跳
- deque能包含更多的元素,所以max_size()更大一些
- Deques不提供控制capacity和再分配的支持
- 当不在使用时,内存空间将释放
所以,当满足一下条件时,使用deque:
- 在两端插入和移除元素
- 不指向Container的元素
- 重要的一点是当不再使用时container会释放内存(并不能保证一定会发生)
2.Constructors and Destructor
Operation | Effect |
deque<Elem> c | Default constructor:创建一个空的deque |
deque<Elem> c(c2) | Copy constructor:通过复制c2创建c |
deque<Elem> c = c2 | Copy constructor:通过复制c2创建c |
deque<Elem> c(rv) | Move constructor:creates a new deque,taking the contents of the rvalue rv |
deque<Elem> c = rv | Move constructor:creates a new deque,taking the contents of the rvalue rv |
deque<Elem> c(n) | 使用默认构造函数创建一个有n个元素的deque |
deque<Elem> c(n, elem) | 创建一个有n个元素的deque,并且使用elem初始化 |
deque<Elem> c(beg, end) | 创建一个使用范围[beg,end)初始化的deque |
deque<Elem> c(initList) | 创建一个使用initList初始化的deque |
deque<Elem> c = initList | 创建一个使用initList初始化的deque |
c.~deque() | 销毁所有元素并释放内存 |
二、Vector Operations
1.Nonmodifying Operations
Operation | Effect |
c.empty() | 返回容器是否为空(相当于size() == 0) |
c.size() | 返回当前元素的个数 |
c.max_size() | 返回可能存在元素的最大个数 |
c.shrink_to_fit() | 收缩capacity,适应元素个数 |
c1 == c2 | 返回c1是否等于c2 |
c1 != c2 | 返回c1是否不等于c2 |
c1 < c2 | 返回c1是否小于c2 |
c1 > c2 | 返回c1是否大于c2 |
c1 <= c2 | 返回c1是否小于等于c2 |
c1 >= c2 | 返回c1是否大于等于c2 |
c[idx] | 返回索引为idx的元素(无边界检查) |
c.at[idx] | 返回索引为idx的元素(有边界检查,抛出异常) |
c.front() | 返回第一个元素(不检查元素是否存在) |
c.back() | 返回最后一个元素(不检查元素是否存在) |
2.Modifying Operations
Operation | Effect |
c.push_back(elem) | 将elem附加到末尾 |
c.pop_back() | 移除最后一个元素,不返回 |
c.push_front(elem) | 将elem附加到开头 |
c.pop_front() | 移除第一个元素,不返回 |
c.insert(pos, elem) | 将elem插入到pos之前的位置,并返回新元素的位置 |
c.insert(pos, n, elem) | 在pos之前的位置开始插入n个elem,并返回新插入的第一个元素的位置 |
c.insert(pos, beg, end) | 将[beg, end)的值插入到从pos之前的位置,并返回第一个新元素的位置 |
c.insert(pos, initlist) | 将initlist的值插入到从pos之前的位置,并返回第一个新元素的位置 |
c.emplace(pos, args...) | 将args插入到pos之前的位置,并返回第一个新元素的位置 |
c.emplace_back(args...) | 将args附加到末尾 |
c.emplace_front(args...) | 将args附加到开头 |
c.erase(pos) | 移除pos所指的元素,并返回下一个元素位置 |
c.erase(beg, end) | 移除范围[beg,end)的元素,并返回下一个元素的位置 |
c.resize(num) | 设置元素个数为num,如果增长了,使用默认构造函数初始化 |
c.resize(num, elem) | 设置元素个数为num,如果增长了,使用elem初始化 |
c.clear() | 移除所有元素 |
三、Example of Using Deques
#include<iostream>
#include<deque>
#include<string>
#include<algorithm>
#include<iterator>
using namespace std;
int main()
{
//create empty deque of string
deque<string> coll;
//insert several elements
coll.assign( 3, "string");
coll.push_back("last string");
coll.push_front("first string");
//print elements separated by newlines
copy(coll.cbegin(), coll.cend(),
ostream_iterator<string>(cout, "\n"));
cout << endl;
//remove first and last element
coll.pop_front();
coll.pop_back();
//insert "another" into every element but the first
for(unsigned i = 1; i < coll.size(); ++i) {
coll[i] = "another " + coll[i];
}
//change size to four elements
coll.resize( 4, "resized string");
//print elements separated by newlines
copy( coll.cbegin(), coll.cend(),
ostream_iterator<string>(cout, "\n"));
}
输出:
来源:oschina
链接:https://my.oschina.net/u/2368202/blog/716731