STL中的deque容器

原创 2013年12月04日 21:21:08

deque全称为“double-ended queue”,是一种动态数组形式,是一种随机访问的数据类型,是一种双端队列容器。它的重要特征就是在deque的两端放置元素和删除元素是高效的,而vector对象只有在其尾部执行操作时才有较高的效率。deque有五中初始化方式:

1.deque<A> name; 2.deque<A>name(size); 3.deque<A>name(size,value); 4.deque<A>name(mydeque); 5.deque<A>name(first, last);

#include <string>
#include <deque>
#include <iostream>
#include<algorithm>
void main (void) 
{  std:: deque<std::string> Mydeque;
Mydeque.push_back("good!");
Mydeque.insert(find(Mydeque.begin(),Mydeque.end(),"good!"),"YCL");
copy(Mydeque.begin(),Mydeque.end(),std::ostream_iterator<std::string>(std::cout," "));
}

///////////////遍历deque元素////////////////////

#include <iostream>
#include <deque>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
int main()
{
deque<int> myDeque(10,1);
int x=0;
deque<int>::iterator iter;
for(iter=myDeque.begin(); iter!=myDeque.end();iter++)
{ cout<<"Element "<<x++<<":"<<*iter<<endl;}
return 1;
}

////////////////////deque赋值///////////////////////////

#include <iostream>
#include <deque>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
typedef deque<int, allocator<int> >  INTDEQUE;
void printcontents (INTDEQUE  deque);
void main()
{
INTDEQUE  dequetest;
    dequetest.push_front(1);
    dequetest.push_front(2);
    dequetest.push_front(3);
    printcontents (dequetest);
    dequetest.pop_front();
    printcontents (dequetest);
    dequetest.pop_back();
    printcontents (dequetest);
}
void printcontents (INTDEQUE  deque)
{
    INTDEQUE::iterator pdeque;
    cout <<"The output is:"<<endl;
    for(pdeque = deque.begin(); pdeque != deque.end(); pdeque++)
    {    cout << *pdeque <<" " ; };
cout <<endl;
}

//////////////////////////////////内容交换,有两种交换方式,看下面实例//////////////////////////////////

#include <deque>
#include <iostream>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
int main( ) 
{
   deque <int> c1, c2, c3;
   deque <int>::iterator c1_Iter;
   c1.push_back( 1 );
   c1.push_back( 2 );
   c1.push_back( 3 );
   c2.push_back( 10 );
   c2.push_back( 20 );
   c3.push_back( 100 );
   cout << "The original deque c1 is: ";
   for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
      cout << *c1_Iter << " ";
   cout << endl;
   c1.swap( c2 ); // 把c1和 c2两个容器中的内容进行相互交换,这是其中一种交换方法,swap当私有变量
   cout << "After swapping with c2, deque c1 is: ";
   for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
      cout << *c1_Iter << " ";
   cout << endl;
   swap( c1,c3 ); // 把c1和 c3两个容器中的内容进行相互交换,另一种交换方法,swap当通用算法
   cout << "After swapping with c3, deque c1 is: ";
   for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
      cout << *c1_Iter << " ";
   cout << endl;
   return 0;
}

//////////////////////通过重置assign也可以实现内同交换//////////////////////////

#include <iostream>
#include <deque>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
typedef deque<char >  CHARDEQUE;
void print_contents (CHARDEQUE  deque, char*);
int main()
{
    CHARDEQUE  a(3,'A'); //定义了变量a,内容是3个'A'
    CHARDEQUE  b(4,'B'); //定义了变量b,内容是4个'B'
    //print_contents (a,"a");
   // print_contents (b,"b");
    a.swap(b); //内容互换
   // print_contents (a,"a");
   // print_contents (b,"b");
    a.swap(b);//内容换回来
    print_contents (a,"a");
    print_contents (b,"b");
    a.assign(b.begin(),b.end());
    print_contents (a,"a");
    a.assign(b.begin(),b.begin()+2);
    print_contents (a,"a");
     a.assign(3,'Z');
    print_contents (a,"a");
return 0;
}
//下面是显示函数源代码
void print_contents (CHARDEQUE  deque, char *name)
{
    CHARDEQUE::iterator pdeque;
    cout <<"The contents of "<< name <<" : ";
        for(pdeque = deque.begin();
        pdeque != deque.end();
        pdeque++)
    {
        cout << *pdeque <<" " ;
    }
    cout<<endl;
}

///////////////////////////////////////////////////////////插入insert操作,有三种方式/////////////////////////////////////////////////////////////////

#include <iostream>
#include <deque>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
typedef deque<char* >  CHARDEQUE;
void print_contents (CHARDEQUE  deque);
int main()
{   CHARDEQUE  a(3,"A");
    CHARDEQUE  b(2,"B");
    print_contents (a);
    print_contents (b);
    a.insert(a.begin(),"X");  // 在deque的头部插入一元素,值为'X',第一种方式
    print_contents (a);
    a.insert(a.end(),"Rlong"); // 在deque的尾部插入一元素,值为'Y'
    print_contents (a);
    //inset 3 'Z's to one item before the end of a
    a.insert(a.end()-1,3,"Z"); // 在deque的尾部前一元素处插入3个元素,值为'Z',第二中方式
    print_contents (a);
    a.insert(a.end(),b.begin(),b.end()); // 把b的所有值插入到a变量的尾部,第三种方式
    print_contents (a);
return 0;
}
//deque的显示函数
void print_contents (CHARDEQUE  deque)
{   CHARDEQUE::iterator pdeque;
    cout <<"The output is: ";
    for(pdeque = deque.begin(); pdeque != deque.end(); pdeque++)
    {     cout << *pdeque <<" " ;    }
    cout<<endl;
}

///////////////////////////////////erase的两种方式///////////////////////////////////////

#include <deque>
#include <iostream>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
int main( ) 
{  using namespace std;
   deque <int> c1;
   deque <int>::iterator Iter;
   c1.push_back( 10 );
   c1.push_back( 20 );
   c1.push_back( 30 );
   c1.push_back( 40 );
   c1.push_back( 50 );
   cout << "The initial deque is: ";
   for ( Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
      cout << *Iter << " ";
   cout << endl;
   c1.erase( c1.begin( ) );                 //第一种方式
   cout << "After erasing the first element, the deque becomes:  ";
   for ( Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
      cout << *Iter << " ";
   cout << endl;
   Iter = c1.begin( );
   Iter++;
   c1.erase( Iter, c1.end( ) );                         //第二种方式
   cout << "After erasing all elements but the first, deque becomes: ";
   for ( Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
      cout << *Iter << " ";
   cout << endl;
return 0;
}

//////////////////////////////////////////////////////////////////////

除了可以用erase删除某一特定元素或者某一个范围的元素外,STL还提供了另外一个函数clear,它的功能完全可以被erase替换,等效与erase(deque::begin(),deque::end())

如果deque存储的是类对象,这时一般不能采用clear()函数,因为clear()不会自动释放原来对象元素所占用的内存。这时可以使用erase或者pop_back()辅助delete语句进行内存释放和元素删除操作。

#include <deque>
#include <iostream>
#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
#endif
int main( ) 
{  using namespace std;
   deque <int> c1;
   c1.push_back( 10 );
   c1.push_back( 20 );
   c1.push_back( 30 );
   cout << "The size of the deque is initially " << c1.size( ) << endl;
   c1.clear();
   cout << "The size of the deque after clearing is " << c1.size( ) << endl;
   return 0;
}


STL之deque容器的实现框架

vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合。我们知道,vector支...
  • JXH_123
  • JXH_123
  • 2014年06月24日 20:28
  • 1272

stl之deque双端队列容器

deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除。不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势。 头文件 #include...
  • u010418035
  • u010418035
  • 2015年07月03日 09:53
  • 2074

stl容器区别(内存布局和使用场合): vector list deque set map

set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问。  set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少  map:映射,相当于字典,把一个值映射成另一个值...
  • u012223913
  • u012223913
  • 2016年04月22日 22:27
  • 1226

STL源码剖析——deque的实现原理和使用方法详解

Deque 简介     deque是“double—ended queue”的缩写,和vector一样都是STL的容器,deque 是双端数组,而 vector 是单端的。     deque 在接...
  • baidu_28312631
  • baidu_28312631
  • 2015年08月26日 10:48
  • 3859

STL容器底层数据结构

STL底层数据结构 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和...
  • yujin753
  • yujin753
  • 2015年01月27日 21:32
  • 1564

stl容器的区别:vector list deque set map-底层实现

申明,本文非笔者原创,原文转载自:http://blog.sina.com.cn/s/blog_533074eb01017zq2.html 在STL中基本容器有: vector、li...
  • carson2005
  • carson2005
  • 2015年04月29日 11:08
  • 2058

带你深入理解STL之Deque容器

在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点。vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操...
  • terence1212
  • terence1212
  • 2016年08月26日 11:43
  • 3500

C++ STL 迭代器失效

c++ STL迭代器失效总结
  • zxx910509
  • zxx910509
  • 2015年12月18日 09:43
  • 430

基于环形缓冲区的deque实现方法

众所周知,C++ STL中有一个叫做deque的容器,实现的是双端队列数据结构,这种队列允许同时从队列的首部和尾部插入和删除数据。 然而在STL中这种数据结构是用”分段连续”的物理结构实现的(可以参...
  • vipally
  • vipally
  • 2016年10月20日 00:50
  • 568

STL 简单 deque 的实现

我用VS2013写的程序(github ),list版本的代码位于cghSTL/version/cghSTL-0.3.3.rar Vector是单向开口的连续线性空间,而Deque是双向开口的连续线性...
  • chengonghao
  • chengonghao
  • 2016年05月20日 21:33
  • 2323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL中的deque容器
举报原因:
原因补充:

(最多只允许输入30个字)