容器Deque Double-End Queue 双端队列
也采用动态数组来管理元素,提供随机存取,并有着和Vector几乎一模一样的接口。
不同的是Deque动态数组的头尾都是开放的,可以在头尾两端进行安插和删除。
为了获取这样的功能,Deque通常由一组独立的区块实现,第一区块向某方向扩展,而最后区块向另一方向扩展。
和Vector相似的模板声明:
namespace std{
template<class T,class Allocator = allocator<T>>
class deque;
}
第一个template参数表明元素类型 只要是assignable 和 copyable都可以
第二个template参数可有可无,用来指定内存模型memory model,默认为allocator。
1.Deque的能力
# 常数时间constant time内完成在Deque头尾进行安插和删除
# 存取元素的时候,内部结构多了一个间接过程,所以元素的存取和迭代器动作会慢些
# 迭代器需要在不同区块间跳转,所以使用的是特殊的智能型指针
# Deque使用不止一块内存,所以maxsize()可能更大
# 不支持容量和内存重分配时机的控制
安插和删除都可能导致pointer、reference、iterator失效,
唯一例外的是,在头尾部插入,动作之后,pointer和reference依然有效,iterator失效
重分配由于Vector,因为Deque是多个区块,重分配时往往只是在其中一个区块进行,不必复制所有元素,
Deque和Vector相似性能
# 在中部安插和删除效率低
# 支持随机存取,迭代器是随机存取迭代器random access iterator
2.Deque的操作函数
构造和析构:
deque<Elem> d;
deque<Elem> d(d1);
deque<Elem> d(n); //n个元素,这些元素都是用default构造函数产生的
deque<Elem> d(n,elem);
deque<Elem> d(beg,end);
d.~deque<Elem>();
非变动性操作:
d.size();
d.empty();
d.maxsize();
comparison operater ;
d.at(idx); d[idx]; //subscript
d.front(); d.back();
d.begin(); d.end();
d.rebegin(); d.rend();
变动性操作:
d1 = d2; d.assign(n,elem); d.assign(beg,end); //assignment
d1.swap(d2); swap(d1,d2); //swap
d.insert(pos,elem); d.insert(pos,n,elem); d.insert(pos,beg,end); //insert
d.push_front(elem); d.push_back(elem); //push
d.pop_front(); d.pop_back(); //pop
d.erase(pos); d.erase(beg,end); //erase
d.resize(num); d.resize(num,elem); //resize,如果增长了,增长部分以elem赋值或者默认构造函数产生
d.clear(); //clear
与Vector不同:
# 不支持容量操作capacity() and reserve()
# 增加头部操作功能 push_front(elem) pop_front()
3.运用实例
#include <iostream>
#include <deque>
#include <string>
#include <algorithm>
using namespace std;
int main(){
deque<String> d;
d.assign(3,String("string"));
d.push_back("last string");
d.push_front("first string");
copy(d.begin(),d.end(),ostream_iterator<string>(cout,"\n"));
cout<<endl;
d.pop_front();
d.pop_back();
for(int i =1;i < d.size(); ++i){
d[i] = "another" + d[i];
}
d.resize(4,"resized string");
copy(d.begin(),d.end(),ostream_iterator<string>(cout,"\n"));
}
也采用动态数组来管理元素,提供随机存取,并有着和Vector几乎一模一样的接口。
不同的是Deque动态数组的头尾都是开放的,可以在头尾两端进行安插和删除。
为了获取这样的功能,Deque通常由一组独立的区块实现,第一区块向某方向扩展,而最后区块向另一方向扩展。
和Vector相似的模板声明:
namespace std{
template<class T,class Allocator = allocator<T>>
class deque;
}
第一个template参数表明元素类型 只要是assignable 和 copyable都可以
第二个template参数可有可无,用来指定内存模型memory model,默认为allocator。
1.Deque的能力
# 常数时间constant time内完成在Deque头尾进行安插和删除
# 存取元素的时候,内部结构多了一个间接过程,所以元素的存取和迭代器动作会慢些
# 迭代器需要在不同区块间跳转,所以使用的是特殊的智能型指针
# Deque使用不止一块内存,所以maxsize()可能更大
# 不支持容量和内存重分配时机的控制
安插和删除都可能导致pointer、reference、iterator失效,
唯一例外的是,在头尾部插入,动作之后,pointer和reference依然有效,iterator失效
重分配由于Vector,因为Deque是多个区块,重分配时往往只是在其中一个区块进行,不必复制所有元素,
Deque和Vector相似性能
# 在中部安插和删除效率低
# 支持随机存取,迭代器是随机存取迭代器random access iterator
2.Deque的操作函数
构造和析构:
deque<Elem> d;
deque<Elem> d(d1);
deque<Elem> d(n); //n个元素,这些元素都是用default构造函数产生的
deque<Elem> d(n,elem);
deque<Elem> d(beg,end);
d.~deque<Elem>();
非变动性操作:
d.size();
d.empty();
d.maxsize();
comparison operater ;
d.at(idx); d[idx]; //subscript
d.front(); d.back();
d.begin(); d.end();
d.rebegin(); d.rend();
变动性操作:
d1 = d2; d.assign(n,elem); d.assign(beg,end); //assignment
d1.swap(d2); swap(d1,d2); //swap
d.insert(pos,elem); d.insert(pos,n,elem); d.insert(pos,beg,end); //insert
d.push_front(elem); d.push_back(elem); //push
d.pop_front(); d.pop_back(); //pop
d.erase(pos); d.erase(beg,end); //erase
d.resize(num); d.resize(num,elem); //resize,如果增长了,增长部分以elem赋值或者默认构造函数产生
d.clear(); //clear
与Vector不同:
# 不支持容量操作capacity() and reserve()
# 增加头部操作功能 push_front(elem) pop_front()
3.运用实例
#include <iostream>
#include <deque>
#include <string>
#include <algorithm>
using namespace std;
int main(){
deque<String> d;
d.assign(3,String("string"));
d.push_back("last string");
d.push_front("first string");
copy(d.begin(),d.end(),ostream_iterator<string>(cout,"\n"));
cout<<endl;
d.pop_front();
d.pop_back();
for(int i =1;i < d.size(); ++i){
d[i] = "another" + d[i];
}
d.resize(4,"resized string");
copy(d.begin(),d.end(),ostream_iterator<string>(cout,"\n"));
}