• 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)<<"	";
    27     }
    28     cout<<"*****************"<<endl;
    29     swap(dequeTest,dequeTest2);//交换两个队列元素
    30     for (int i=0;i<dequeTest.size();i++)
    31     {
    32         cout<<dequeTest.at(i)<<"	";
    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 }
  • 相关阅读:
    js 构造函数 constructor
    js foreach和map区别
    js 静态方法和实例方法
    学习知识点总结(es6篇)
    java1.5新特性(转)
    21 Managing the Activity Lifecycle
    Java进阶Collection集合框架概要·16
    Java进阶核心之集合框架Map下集·18
    Java进阶核心之集合框架Set·19
    Java进阶核心之集合框架List·17
  • 原文地址:https://www.cnblogs.com/songliquan/p/3315951.html
Copyright © 2020-2023  润新知