C++STL选择合适的容器以及容器操作的时间复杂度
2018-01-19 09:20
716 查看
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。
大量添加新元素的时候不要使用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。
相关文章推荐
- C++ STL容器时间复杂度下的最佳选择
- C++ STL中常见容器的时间复杂度
- C++ STL 有关容器部分 priority_queue 优先级队列的基本操作以及认识案例
- C++ 之高效使用STL (STL 容器的选择)
- C++学习笔记(六):复杂数据类型(string、容器和STL)
- [C++][STL]容器的capacity、max_size以及内存分配
- 选择STL合适容器
- 【C++ STL学习之一】容器的共通能力和共通操作总结
- [C++][STL]容器的capacity、max_size以及内存分配
- C++单链表找倒数第k个节点(时间复杂度为o(n)哦,用相距k节点的2个指针进行操作)
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- C++ 涉及到STL 中 map与multimap的基本操作 以及相应的区别 20180325day13
- 设计队列容器的数据结构,使得返回最大元素的操作时间复杂度尽可能的低。
- [C++再学习系列] STL容器删除操作总结
- c++ stl容器相关操作
- C++ STL之list容器的基本操作
- 仔细选择合适的STL容器
- C++ 之高效使用STL (STL 容器的选择)
- [C++再学习系列] STL容器删除操作总结
- C++ STL 不同容器的比较 以及使用时机