C++中STL常用容器的优点和缺点

我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。

verctor

vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。

list

list类似于C语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,因而它没有提供 [] 操作符重载。

deque

deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率
也差不多。或者我们可以这么认为,deque是vector跟list的折中。

map

map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,这种特性了使得map类似于数据结构里的红黑二叉树。

multimap

multimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。

set

set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。

multiset

multiset类似于数学里面的集合,集合中可以包含重复的元素。

小结

在实际使用过程中,到底选择这几种容器中的哪一个,应该根据遵循以下原则:

1、如果需要高效的随机存取,不在乎插入和删除的效率,使用vector;

2、如果需要大量的插入和删除元素,不关心随机存取的效率,使用list;

3、如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque;

4、如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap;

5、如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset。


  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STL(Standard Template Library)是C++标准库的一部分,提供了一组标准的容器类,用于管理和组织数据。在STL容器是一种数据结构,可以用来存储和操作一组相关数据。下面对STL常用容器进行表格详细对比讲解: | 容器类型 | 简介 | 应用场景 | 优点 | 缺点 | | --- | --- | --- | --- | --- | | vector | 动态数组,支持随机访问 | 存储一组数据,需要随机访问元素 | 内存连续,支持随机访问,尾部插入和删除元素快 | 插入和删除元素时需要移动元素,不支持在间插入元素 | | deque | 双端队列,支持随机访问 | 存储一组数据,需要在头部和尾部插入和删除元素 | 内存空间被分割成多个块,支持快速在头部和尾部插入和删除元素,支持随机访问 | 空间分配较为复杂,不支持在间插入元素 | | list | 双向链表,不支持随机访问 | 存储一组数据,需要在间插入和删除元素 | 插入和删除元素时不需要移动元素,支持在间插入和删除元素 | 不支持随机访问,不能直接通过下标访问元素 | | forward_list | 单向链表,不支持随机访问 | 存储一组数据,需要在间插入和删除元素 | 插入和删除元素时不需要移动元素,只支持在头部插入和删除元素 | 不支持随机访问,不能直接通过下标访问元素 | | stack | 栈,后进先出 | 存储一组数据,需要后进先出的访问方式 | 可以使用已有的容器实现,简单易用 | 只支持在栈顶插入和删除元素,无法随机访问元素 | | queue | 队列,先进先出 | 存储一组数据,需要先进先出的访问方式 | 可以使用已有的容器实现,简单易用 | 只支持在队列头和尾部插入和删除元素,无法随机访问元素 | | priority_queue | 优先队列,按照一定的优先级进行访问 | 存储一组数据,需要按照一定优先级进行访问 | 可以使用已有的容器实现,支持自定义优先级比较函数 | 只能访问优先级最高的元素,无法随机访问元素 | | set | 集合,存储一组无序不重复的元素 | 存储一组无序不重复的元素,需要支持查找和插入操作 | 内部使用红黑树实现,支持自动排序和去重 | 插入和删除元素时需要平衡红黑树,效率较低 | | multiset | 多重集合,存储一组无序可重复的元素 | 存储一组无序可重复的元素,需要支持查找和插入操作 | 内部使用红黑树实现,支持自动排序和重复元素 | 插入和删除元素时需要平衡红黑树,效率较低 | | map | 映射,键值对,存储一组无序不重复的元素 | 存储一组无序不重复的键值对,需要支持查找和插入操作 | 内部使用红黑树实现,支持自动排序和去重 | 插入和删除元素时需要平衡红黑树,效率较低 | | multimap | 多重映射,键值对,存储一组无序可重复的元素 | 存储一组无序可重复的键值对,需要支持查找和插入操作 | 内部使用红黑树实现,支持自动排序和重复元素 | 插入和删除元素时需要平衡红黑树,效率较低 | 以上是常用STL容器类型的简介、应用场景、优点缺点的对比,选择何种容器取决于具体的需求,在使用时需要根据实际情况进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值