C++ STL 常用容器 学习笔记

来源:互联网 发布:js多选框 编辑:程序博客网 时间:2024/06/03 18:35

一、vector

       1. vector相当于一个动态数组,支持随机存取。

       2. 如果在vector前端或者中部安插或删除元素,性能比较差,因为操作点之后的每一个元素都必须移动位置。

       3. 函数 capacity() ,它返回实际能够容纳的元素数量,如果超过这个数量,vector 有必要重新分配内存(一倍),然后将元素重新复制到vector里。

       4. 一旦内存重新配置,和vector元素相关的所有reference 、 pointer、iterators都会失效。  而且内存重新配置十分耗时间。

       5. 所以如果考虑速度和pointer等,则需要考虑容量问题。可以使用reverse(num)保留适当容量,避免内存重新分配。或者在初始化期间向构造器传递 参数,构造出足够的               空间。

       6. 只有at()函数检查下标是否合法,可能抛出异常。

       7. clear()实际上是循环调用erase(),删除元素不释放内存,只有在vector的析构函数才释放内存。



二、deque

       1.也采用动态数组来管理元素,提供随机存取,但是deque动态数组首尾都开放,因此能在两头进行快速安插和删除。

       2.迭代器需要在不同区块间跳转,所以必须是特殊的智能型指针。

       3.deque不必再内存重分配时复制所有元素、

       4.内存区块不再被使用时会被释放。

       5.deque不提供capacity()和reserve()操作。

       6.在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。


三、Lists

         1.Lists使用一个双向链表来管理元素。

         2.Lists不支持随机存取。所以在lists中遍历任意元素,是个缓慢的行为。但在任何位置上安插和移除都非常快,无需移动其他元素。

         3.对于小对象,vector的效率比list更高。数据类型越大越复杂,vector效率比list越低。



四、Set和Multiset

     1.set和multiset会根据特定的排序准则,自动将元素排序。multiset允许元素重复,而set不允许。

     2.set和multiset通常以平衡二叉树(红黑树)完成。

     3.自动排序的主要优点使搜索元素时具有良好的性能。但造成一个重要的限制:你不能直接改变元素值,因为这样会打乱原本正确的顺序,因此,要改变元素         值,必须先删除旧元素,再增加新元素。

     4. 内存占用为包含每个数据元素的节点。




0 0
原创粉丝点击