C++STL选择合适的容器以及容器操作的时间复杂度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nash_Cyk/article/details/79102754

C++ STL对每一个开发者起着至关重要的作用,每一种容器封装好了相应的数据结构,从而保证我们在使用容器的时候安全稳定高效,不过如何在特定的场景选择合适的容器,我们还是需要注意很多细节的,more effective stl这本书详细描述了STL的注意事项,从中总结部分如下:
大量添加新元素的时候不要使用vector 因为vecter内部的实现方式是利用new2倍的原有内存空间然后再拷贝,影响效率,这个时候可以选择list。
关联容器比如map 查找时候时间复杂度为logn 因为其内部实现方式采用的是红黑树。
二分查找时间复杂度为logn 数组非有序时间复杂度则为n采用遍历方式。
如果频繁出现插入删除操作时尽量避免使用vector和deque 因为其内部是内存连续,插入或者删除都同一块内存其他数据都需要整体的移位。
遍历顺序容器的时候和插入的顺序是一致的,而关联内容则可能会不一定,关联容器可能会内部自动处理变成有序形式。
Vector的数据模型就是数组,这点与C完全兼容、高效随机访问、节省空间。但是缺点是内部插入删除元素代价巨大、动态大小查过自身容量需要申请大量内存做大量拷贝。
List 的数据结构模型是链表,任意位置插入删除元素常量时间复杂度、两个容器融合是常量时间复杂度 On,但是不支持随机访问、比vector占用更多的存储空间。
Deque的数据模型是数组和链表的折衷,高效随机访问、内部插入删除元素效率方便、两端push pop,同样内存占用率比较高。
Map、set、multimap、multiset的数据结构模型是二叉树(红黑树),元素会按照键值排序、查找是对数时间复杂度、通过键值查元素、map提供了下标访问 logn。
如果需要随机访问,用vector,如果存储元素的数目已知,用vector,需要任意位置随机插入删除,用list,只有需要更多在容器的首部尾部插入删除元素,用deque,元素是复杂结构用list,也可以用vector存储指针(需要额外的精力去维护内存),看需求。,如果操作是基于键值,用set map,如果需要经常的搜索,用map set,同样我们如果最小效率速度,可以利用hash_map,相对于以空间换时间,时间复杂度为O1。

猜你喜欢

转载自blog.csdn.net/Nash_Cyk/article/details/79102754