STL学习笔记3--deque

看这一节,是为了下一节的使用,在ogre3d里有些操作要使用到deque。

C++ Deque(双向队列) 的使用

  Deque结合了vector  和list  优缺点,是一种使用简单的容器。

  deque 的特点:
  (1) 随机访问方便,即支持[ ] 操作符和vector.at() ,但性能没有vector 好;
  (2) 可以在内部进行插入和删除操作,但性能不及list ;
  (3) 可以在两端进行push 、pop ;
  (4) 相对于verctor 占用更多的内存。

   常用的函数和list的基本相同,除了个别的几个,如

  1、 创建一个新双向队列 ,构造函数很多

1 deque();//创建一个空双向队列 
2 deque( size_type size );//  创建一个大小为size的双向队列 
3 deque( size_type num, const TYPE &val ); //放置num个val的拷贝到队列中 
4 deque( const deque &from );//  从from创建一个内容一样的双向队列 
5 deque( input_iterator start, input_iterator end ); // start  和  end -  创建一个队列,保存从start到end的元素。   

  2、Operators 比较和赋值双向队列 

    //可以使用[]操作符访问双向队列中单个的元素,代码如下

 1     deque <int> dequeTest;
 2     deque <int>::iterator it;
 3     deque <int> dequeTest2;
 4     for (int i=0;i<10;i++)
 5     {
 6         dequeTest.push_back(i);
 7         dequeTest2.push_back(10+i);
 8     }
 9 
10     cout<<dequeTest[9]<<endl;//使用[]直接操作元素获取最后一个元素
11     cout<<dequeTest.back()<<endl;//获取最后一个元素

   3、链表操作

  max_size() 返回双向队列能容纳的最大元素个数
  pop_back() 删除尾部的元素
  pop_front() 删除头部的元素
  push_back() 在尾部加入一个元素
  push_front() 在头部加入一个元素

   具体代码在最后面,很简单,我这里就不多解释了。

 

 看完标准容器,我们总结一下三者的优缺点

  vector 是一段连续的内存块,而deque 是多个连续的内存块, list 是所有数据元素分开保存,可以是任何两个元素没有连续。 vector 的查询性能最好,并且在末端增加数据也很好,除非它重新申请内存段;适合高效地随机存储。

   list 是一个链表,任何一个元素都可以是不连续的,但它都有两个指向上一元素和下一元素的指针。所以它对插入、删除元素性能是最好的,而查询性能非常差;适合大量地插入和删除操作而不关心随机存取的需求。

   deque 是介于两者之间,它兼顾了数组和链表的优点,它是分块的链表和多个数组的联合。所以它有被list好的查询性能,有被vector好的插入、删除性能。 如果你需要随即存取又关心两端数据的插入和删除,那么deque是最佳之选。

 

deque代码:

 1 #include "deque"
 2 #include "iostream"
 3 using namespace std;
 4 int main()
 5 {
 6     deque <int> dequeTest;
 7     deque <int>::iterator it;
 8     deque <int> dequeTest2;
 9     for (int i=0;i<10;i++)
10     {
11         dequeTest.push_back(i);
12         dequeTest2.push_back(10+i);
13     }
14 
15     cout<<dequeTest[9]<<endl;//获取最后一个元素
16     cout<<dequeTest.back()<<endl;//获取最后一个元素
17 
18     it = dequeTest.end();
19     cout<<dequeTest.size()<<endl;//元素个数
20     cout<<dequeTest.back()<<endl;//获取最后一个元素
21     cout<<dequeTest.front()<<endl;//获取最后一个元素
22     cout<<dequeTest.max_size()<<endl;//最大容量
23 
24     for (int i=0;i<dequeTest.size();i++)
25     {
26         cout<<dequeTest.at(i)<<"\t";
27     }
28     cout<<"*****************"<<endl;
29     swap(dequeTest,dequeTest2);//交换两个队列元素
30     for (int i=0;i<dequeTest.size();i++)
31     {
32         cout<<dequeTest.at(i)<<"\t";
33     }
34     
35     dequeTest.clear();//清空
36     if (dequeTest.empty())
37     {
38         cout<<"dequeTest is empty"<<endl;
39     }
40     getchar();
41     getchar();
42     return 0;
43 }

 

 

posted @ 2013-09-12 00:00  struggle_time  阅读(445)  评论(0编辑  收藏  举报