c++ stl各容器特性、效率以及应用场景的全面总结

1 篇文章 0 订阅

记录一下,为了方便日后使用,也供大家参考。
STL容器效率比较:

名称和迭代器迭代器失效插入删除查找场景
vector向量、顺序、随机访问插入和删除都会失效尾端O(1)非尾端P:O(N-P)尾端O(1)非尾端P:O(N-P)O(1)需要快速查找,不需要频繁插入/删除
string字符串、顺序、随机访问插入失效,删除不会尾端O(1)非尾端P:O(N-P)尾端O(1)非尾端P:O(N-P)O(1)类似vector,但是string删除元素不会释放空间(为了下次操作方便)
array数组、顺序固定长度O(1)类似vector,比数组更安全(不担心越界),但是内容在栈上,且属于定长容器。
deque双向队列、顺序、随机访问插入失效。删除头和尾元素,指向被删除节点迭代器失效,而删除中间元素会使所有迭代器失效首尾端:O(1)非首尾P:O(min(p, N-P))首尾端:O(1)非首尾P:O(min(p, N-P))O(1)头尾增删元素很快,随机访问比vector慢一点,因为内部处理堆跳转。中间插入和删除效率交较高。因为他是list和vector综合的样子。使用较少
forward_list前向列表、顺序、单向插入不失效,被删除节点自身失效。O(1)O(1)O(N)需要list的优势,但只要向前迭代
list列表容器、顺序、双向插入不失效,被删除节点自身失效。O(1)O(1)O(N)需要频繁插入/删除,不需要快速查找
queue队列(容器适配器)不支持迭代器只能尾端入:O(1)只能首端删除:O(1)不支持FIFO(先进先出)。底层容器可以是list或deque。
priority_queue优先、队列(容器适配器)不支持迭代器只能尾端入:O(1)只能首端删除:O(1)不支持FIFO(先进先出)。底层容器可以是vector或deque。
stack栈(容器适配器不支持迭代器只能尾端入:O(1)只能尾端删除:O(1)不支持FILO(先进后出)底层容器可以是list或vector或deque。
set/multiset集合/多重集合(有序关联)双向插入不失效。删除时只是被删除节点的迭代器失效,但迭代器返回void,所以需要保存删除前迭代器位置。O(logN)O(logN)O(logN)需要元素有序,查找/删除/插入性能一样。红黑树效率都是O(logN)。即使是几个亿的内容,最多也查几十次。
map/multimap映射/多重映射有序关联)双向同↑O(logN)O(logN)O(logN)需要key有序将值关联到key,查找/删除/插入性能一样
unordered_map /multimap无序集合(无序关联/哈希表)单向插入删除失效平均情况:O(1)最差情况:O(N)平均情况:O(1)最差情况:O(N)平均情况:O(1)最差情况:O(N)内存使用比有序的高一些,但是查找速度更快。只有哈希函数太差或者发生哈希重建才会退化为O(N)。但是一般很少发生,均摊还是O(1)。
unordered_set /multiset无序映射(无序关联/哈希表)单向插入删除失效平均情况:O(1)最差情况:O(N)平均情况:O(1)最差情况:O(N)平均情况:O(1)最差情况:O(N)内存使用比有序的高一下,但是查找速度更快。只有哈希函数太差或者发生哈希重建才会退化为O(N)。但是一般很少发生,均摊还是O(1)。
bitsetO(1)需要标志集合时
  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了一组数据结构和算法的模板类,可以大大简化C++程序的开发过程。STL包含了多个容器类,每个容器类都有其特定的特性和用途。 STL中的容器类主要分为序列容器和关联容器两大类。序列容器包括vector、list、deque和array,它们按照元素在容器中的位置进行存储和访问。关联容器包括set、multiset、map、multimap和unordered系列容器,它们按照键值进行存储和访问。 序列容器具有以下特性: 1. 动态大小:序列容器可以根据需要动态调整大小,可以在任意位置插入和删除元素。 2. 快速随机访问:序列容器中的元素可以通过索引快速访问,时间复杂度为O(1)。 3. 按顺序存储:序列容器中的元素按照插入的顺序存储,并保持元素的相对位置不变。 4. 支持迭代器:序列容器提供了迭代器,可以通过迭代器遍历容器中的元素。 关联容器具有以下特性: 1. 自动排序:关联容器中的元素按照键值自动排序,并且可以根据自定义的比较函数进行排序。 2. 快速查找:关联容器支持快速的查找操作,时间复杂度为O(log n)。 3. 不允许重复键值:set和map容器中的键值是唯一的,而multiset和multimap容器允许重复的键值。 4. 无序容器:unordered系列容器C++11引入的,它们使用哈希函数来存储和访问元素,查找操作的平均时间复杂度为O(1)。 总而言之,C++ STL提供了丰富的容器类,每个容器类都有其独特的特性和适用场景,可以根据具体需求选择合适的容器来存储和操作数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++——STL容器](https://blog.csdn.net/JAN6055/article/details/122758690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++STL容器类详解](https://blog.csdn.net/Jinyizhi2233/article/details/131640448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值