deque与vector类似,能够进行随机查询
- deque与vector的差异
- vector只能够在尾部快速地进行插入、删除操作;而deque能够在前后两端进行快速插入、删除操作
- 访问元素时,deque内部结构会多一个间接过程,所以元素的访问和迭代器的移动会比vector稍慢一些
- 在内存块大小有限制的系统中,deque可以包含更多元素,因为他使用不止一块内存
- deque不支持对容量和内存重新分配时机的控制
- deque会释放不再使用的内存区块
- 在中部插入或移除元素较慢,因为所有元素需要移动以腾出或填补空间
- 迭代器属于random-access iterator
- 需要选择使用deque的场景
- 需要在两端安插、移除元素
- 无须指向容器内的元素
- 不再使用的元素必须释放
根据deque与vector的区别我们猜测一下:vector存储元素时使用的是一段连续的内存,而deque使用的可能是多段内存,然后使其组合在一起达到模拟成一段连续的内存。下面我们做一些打印来验证一下这个猜测:
int main()
{
deque<int> dq;
for (int i = 0; i < 100; ++i)
{
dq.push_back(i);
}
for (size_t i = 0; i < dq.size(); ++i)
{
if (i % 5 == 0)
{
cout << endl;
}
cout << &dq[i] << ", ";
}
system("pause");
return 0;
}
输出:
明显这些地方都出现了内存跳动,所以猜测成立
- 构造方法
deque<T> c | default构造函数,产生一个空的deque,没有任何元素 |
deque<T> c(c1) | copy构造函数 |
deque<T> c = c1 | copy构造函数 |
deque<T> c(move(c1)) | move构造函数 |
deque<T> c = move(c1) | move构造函数 |
deque<T> c(n) | 利用元素的default构造函数生成一个大小为n的deque |
deque<T> c(n, val) | 建立一个大小为n的deque,每个元素都是val |
deque<T> c(beg, end) | 建立一个deque,以区间[beg, end)元素为初值 |
deque<T> c(initlist) | 建立一个deque,以初值列initlist为初值 |
deque<T> c = initlist | 建立一个deque,以初值列initlist为初值 |
- 增加元素
insert(pos, val) | 在pos之前插入一个val拷贝,并返回新元素的位置 |
insert(pos, n, val) | 在pos之前插入n个val拷贝,并返回第一个新元素的位置 |
insert(pos, beg, end) | 在pos之前插入区间[beg, end)内所有元素的拷贝,并返回第一个新元素的位置 |
insert(pos, initlist) | 在pos之前插入初值列initlist内的所有元素拷贝,并返回第一个新元素的位置 |
emplace(pos, val) | 在pos之前插入一个val为初值的元素,并返回新元素的位置 |
emplace_back(val) | 附加一个以val为初值的元素于末尾,不返回任何东西 |
emplace_front(val) | 附加一个以val为初值的元素于起点,不返回任何东西 |
push_back(val) | 附加一个val的拷贝于末尾 |
push_front(val) | 附加一个val的拷贝于起点 |
resize(n) | 将元素个数改为n,多出来的以元素的default构造函数初始化 |
resize(n, val) | 将元素个数改为n,多出来的元素初始化为val |
assign(n, val) | 赋值n个val,赋值给c |
assign(beg, end) | 将区间[beg, end)的元素赋值给c |
assign(initlist) | 将初值列initlist赋值给c |
- 删除元素
pop_front() | 移除第一个元素 |
pop_back() | 移除最后一个元素 |
erase(pos) | 移除位置pos上的元素,返回下一元素位置 |
erase(beg, end) | 移除区间[beg, end)内所有元素,返回下一元素位置 |
resize(n) | 将元素个数改为n,多出来的以元素的default构造函数初始化 |
resize(n, val) | 将元素个数改为n,多出来的元素初始化为val |
- 修改操作