【C++】STL常用容器总结之十一:容器小结

来源:互联网 发布:osiris数据库 编辑:程序博客网 时间:2024/05/16 17:42

12、容器小结

1、容器的选用

Vector和deque容器提供了对元素的快速访问,但付出的代价是,在容器的任意位置插入或删除元素,比在容器尾部插入和删除的开销更大,因为要保证其连续存储,需要移动元素;list类型在任何位置都能快速插入和删除,因为不需要保证连续存储,但付出的代价是元素的随机访问开销较大。特征如下:
- 与vector容器一样,在deque容器的中间insert或erase元素效率比较低;
- 不同于vector容器,deque容器提供高效地在其首部实现insert和erase的操作,就像在尾部一样;
- 与vector容器一样而不同于list容器的是,deque容器支持对所有元素的随机访问。
- 在deque容器首部或尾部删除元素则只会使指向被删除元素的迭代器失效。在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器都失效。

2、容器的比较

  • Vector:连续的空间存储,可以使用[ ]操作符。Vector可以快速访问随机的元素,快速的在末尾插入元素,但是在序列中间随机的插入、删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销。
  • Deque:小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[ ],只是速度没有vector快。Deque可以快速访问随机的元素,快速的在开始和末尾插入元素,随机的插入、删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后再复制回deque。
  • List:每个元素间用链表相连。访问随机元素不如vector快,随机的插入元素比vector快,对每个元素都分配空间,所以不存在空间不够,重新分配的情况。
  • Set:内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快。
  • Map:一对一的映射的结合,key不能重复。
  • Stack:适配器,必须结合其他的容器使用,STL中默认的内部容器是deque。先进后出,只有一个出口,不允许遍历。
  • Queue:是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历。
  • Priority_queue:插入的元素有优先级顺序,top出来的元素是优先级最高的。
    容器比较

3、容器的选用法则

  • 如果程序要求随机访问元素,则应使用vector或deque容器。
  • 如果程序必须在容器的中间位置插入或删除元素,则应采用list容器。
  • 如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器。
  • 如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可以在输入时将元素读入到一个list容器中,然后对容器排序,再将排序后的list容器复制到vector容器中。
  • 如果程序既需要随机访问,又需要在容器的中间位置插入或删除元素,此时应当权衡哪种操作的影响较大,从而决定选择list容器还是vector或deque容器。注:此时若选择使用vector或deque容器,可以考虑只使用它们和list容器所共有的操作,比如使用迭代器而不是下标,避免随机访问元素等,这样在必要时,可以很方便地将程序改写为使用list容器。

4、随便说说容器

我们在学习容器的时候,首先需要掌握的是容器的原理:某种容器采用什么底层数据结构实现、某种容器适合什么样的操作、某种容器的一些常用操作函数等等。然后,在遇到具体的问题时,我们可以根据需求选择合适的容器,完成需要执行的功能。

结语

容器的大部分内容已经介绍完了。如果大家想进一步了解STL的使用,可以阅读上文给出的两本书籍,当然最好的学习方法是实践,具体的练习有助于更好的理解。

PS

如果大家发现什么问题,请联系博主就行修正,谢谢!

0 0