deque是一个双向队列,优化了对序列两端元素进行添加和删除操作的基本序列容器。通常由一些独立的区块组成,第一个区块朝某方向发展,最后一个区块朝另一个方向发展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。

deque的特点:

1、支持随机访问,即支持[]以及at(),但是性能没有vector好

2、可以在内部进行插入和删除操作,但性能不及list。

deque和vector的不同之处:

1、deque两端都能够快速的插入和删除元素。vector只能在尾端进行。

2、deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个简介过程。

3、迭代器时特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转。

4、deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。

5、不支持对容量和内存分配时机的控制。

 

容器的选择:

1、强调快速随机访问,则vector比list好得多。

2、已知要存储元素的个数。vector好于list。

3、强调增删且不要在两端插入修改元素,则list显然要比vector好。

4、除非我们需要在容器首部插入和删除元素,deque好于vector。

 

实例:

插入操作:

deque<string> dec;
dec.push_back("hello");   //尾部插入
dec.push_front("world");  //头部插入
//insert操作
//iterator insert (iterator position, const value_type& val);
dec.insert(dec.end(), "aaaaaa");
//void insert (iterator position, size_type n, const value_type& val);
dec.insert(dec.end(), 5, "bbb");
//void insert (iterator position, InputIterator first, InputIterator last);
deque<string> t_dec(2,"ccc");
dec.insert(dec.end(), t_dec.begin(), t_dec.end());

删除操作:

dec.pop_back();  //尾部删除
dec.pop_front();  //头部删除
    
//erase操作
//iterator erase (iterator position);
dec.erase(dec.begin());
//iterator erase (iterator first, iterator last);
dec.erase(dec.end()-3, dec.end());
//删除指定元素
deque<string>::iterator iter;
for(iter = dec.begin(); iter != dec.end(); )
{
    if(*iter == "bbb")
    {
        iter = dec.erase(iter);
    }
    else
    {
        ++iter;
    }
} 
dec.back();  //返回最后一个元素
dec.front();  //返回第一个元素
dec.empty();  //判断是否为空
 
//调整容器大小,不足以参数2补充
dec.resize(5);
dec.resize(5,"hello");
  
dec.size();  //容器大小
deque<string> s_dec;
swap(s_dec, dec);  //交换容器内容
s_dec.swap(dec);   //交换容器内容
dec.clear();  //清空
//反序输出
deque<string>::reverse_iterator rit;
for(rit = dec.rbegin(); rit != dec.rend(); ++rit)
{
    cout<<*rit<<endl;
}

参考:

https://blog.csdn.net/xiajun07061225/article/details/7442816

https://www.cnblogs.com/engineerLF/p/5393006.html

http://www.cplusplus.com/reference/deque/deque/

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐