STL容器类vector,list,deque的比较

      C++的STL模板库中提供了3种容器类:vector,list,deque
     
        vector - 会自动增长的数组

        list - 擅长插入删除的链表

        deque - 拥有vector和list两者优点的双端队列

  

  •       vector - 会自动增长的数组
          vector又称为向量数组,他是为了解决程序中定义的数组是
          不能动态改变大小这个缺点而出现的。
          由于程序自动管理数组的增长,对于我们程序员来说确实轻松了不少,
          只管把数据往里面插就行vector由于数组的增长只能向前,所以只提供了后端插入和后端删除,
          也就是push_back和pop_back。当然在前端和中间要操作数据也是可以的,
          用insert和erase,但是前端和中间对数据进行操作必然会引起数据块的移动,
          这对性能影响是非常大的。

          对于所有数组来说,最大的优势就是随机访问的能力。
          在vector中,提供了at和[]运算符这两个方法来进行随机访问。
          由于每个数据大小相同,并且无间隔地排列在内存中,
          所以要对某一个数据操作,只需要用一个表达式就能直接计算出地址:
          address = base + index * datasize

          同样,对vector进行内存开辟,初始化,清除都是不需要花大力气的,
          从头到尾都只有一块内存。

  •        list - 擅长插入删除的链表
          链表强悍的就是动态增长和删除的能力。P
          但对于数组强悍的随机访问能力来说的话,链表却很弱。

                list是一个双向链表的实现。
                为了提供双向遍历的能力,list要比一般的数据单元多出两个指向前后的指针。
                这也是没办法的,毕竟现在的PC内存结构就是一个大数组,
                链表要在不同的环境中实现自己的功能就需要花更多空间。

                list提供了push_back,push_front,pop_back,pop_front四个方法
                来方便操作list的两端数据的增加和删除,不过少了vector的at和[]运算符的
                随机访问数据的方法。并不是不能实现,而是list的设计者
                并不想让list去做那些事情,因为他们会做得非常差劲。

                对于list来说,清除容器内所有的元素是一件苦力活,
                因为所有数据单元的内存都不连续,list只有一个一个遍历来删除。 
     

  •        deque - 拥有vector和list两者优点的双端队列
            STL的deque的实现没有怎么去看过,不过根据我自己的猜测,
          应该是把数组分段化,在分段的数组上添加指针来把所有段连在一起,
          最终成为一个大的数组。

               deque和list一样,提供了push_back,push_front,
               pop_back,pop_front四个方法。可以想象,如果要对deque的两端进行操作,
              也就是要对第一段和最后一段的定长数组进行重新分配内存区,
              由于分过段的数组很小,重新分配的开销也就不会很大。

              deque也和vector一样,提供了at和[]运算符的方法。
               要计算出某个数据的地址的话,虽然要比vector麻烦一点,
               但效率要比list高多了。
              首先和list一样进行遍历,每次遍历的时候累积每段数组的大小,
              当遍历到某个段,而且baseN <= index < baseN + baseN_length的时候,
              通过address = baseN + baseN_index就能计算出地址
              由于分过段的后链表的长度也不是很长,所以遍历对于
              整体性能的影响就微乎其微了。

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章