STL常用容器浅谈

本文介绍了C/C++标准模板库(STL)中的几种常用容器,包括顺序性容器(vector、deque、list)和关联容器(map)。详细探讨了每种容器的特点及应用场景,帮助读者根据需求选择合适的容器。

STL常用容器浅谈
  STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。

1、顺序性容器

(1)vector

  vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23…..增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决: vector V;
    V.push_back(1); V.push_back(2);V.push_back(1); V.push_back(2);
    vector().swap(V); 或者 V.swap(vector());
  利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。
(2)deque

  deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。

(3)list

  list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

(4)在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
  1) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
  2) 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
  3) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

2、关联容器

(1)map

  map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能,所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。这是map的模板:
      template < class Key, class T, class Compare= less, class Allocator=allocator< pair

航拍图像多类别实例分割数据集 一、基础信息 • 数据集名称:航拍图像多类别实例分割数据集 • 图片数量: 训练集:1283张图片 验证集:416张图片 总计:1699张航拍图片 • 训练集:1283张图片 • 验证集:416张图片 • 总计:1699张航拍图片 • 分类类别: 桥梁(Bridge) 田径场(GroundTrackField) 港口(Harbor) 直升机(Helicopter) 大型车辆(LargeVehicle) 环岛(Roundabout) 小型车辆(SmallVehicle) 足球场(Soccerballfield) 游泳池(Swimmingpool) 棒球场(baseballdiamond) 篮球场(basketballcourt) 飞机(plane) 船只(ship) 储罐(storagetank) 网球场(tennis_court) • 桥梁(Bridge) • 田径场(GroundTrackField) • 港口(Harbor) • 直升机(Helicopter) • 大型车辆(LargeVehicle) • 环岛(Roundabout) • 小型车辆(SmallVehicle) • 足球场(Soccerballfield) • 游泳池(Swimmingpool) • 棒球场(baseballdiamond) • 篮球场(basketballcourt) • 飞机(plane) • 船只(ship) • 储罐(storagetank) • 网球场(tennis_court) • 标注格式:YOLO格式,包含实例分割的多边形坐标,适用于实例分割任务。 • 数据格式:航拍图像数据。 二、适用场景 • 航拍图像分析系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割航拍图像中各种物体的AI模型,用于地理信息系统、环境监测等。 • 城市
<think>我们被要求回答STL常用容器的中文名称,并参考提供的引用内容。同时,回答需要符合格式要求,包括正确的LaTeX格式和引用标注。 根据引用内容,我们可以提取以下信息: - 引用[1]提到了vector容器,并列出了其相关操作(构造函数、赋值操作等)。 - 引用[2]提到了set容器,指出其不允许重复元素,并给出了size、empty、swap等操作。 - 引用[3]提到了STL容器与迭代器、算法的结合使用,并给出了auto定义迭代器的例子。 - 引用[4]提到了栈(stack)和队列(queue),说明栈是后进先出(LIFO),队列是先进先出(FIFO),以及优先队列。 - 引用[5]再次提到了栈(stack)及其头文件和函数。 用户的问题是查询STL常用容器的中文名称。结合引用和常见STL容器,我们可以列出以下常用容器的中英文名称: 1. vector -> 向量(或动态数组) 2. list -> 链表 3. deque -> 双端队列 4. stack -> 栈 5. queue -> 队列 6. priority_queue -> 优先队列 7. set -> 集合 8. multiset -> 多重集合 9. map -> 映射(或字典) 10. multimap -> 多重映射 注意:有些容器在引用中直接给出了中文名称,如stack(栈)、queue(队列)、set(集合)等。 在回答中,我们将列出这些常用容器的中英文对照,并适当引用参考内容。 另外,根据要求,我们需要在末尾生成相关问题。 回答结构: 1. 列举STL常用容器的中文名称(表格形式可能更清晰,但由于格式要求,我们可以用列表)。 2. 对部分常用容器进行简要说明(特别是引用中提到的)。 3. 引用标注:在说明时,如果引用了某条内容,则在句末添加引用标识。 注意:由于引用内容有限,我们主要依据引用中出现的容器进行说明,同时补充一些常见的容器。 按照要求,我们使用中文回答,并且使用正确的LaTeX格式(虽然本题可能很少需要数学公式,但若有变量等则使用$...$)。 最后,生成相关问题。 </think>### STL常用容器的中文名称 根据STL容器的特性和中文技术术语习惯,常用容器的中英文对照如下: | 英文名称 | 中文名称 | 特性说明 | |-------------------|----------------|--------------------------------------------------------------------------| | **`vector`** | 向量/动态数组 | 动态数组,支持随机访问,尾部操作高效[^1] | | **`list`** | 链表 | 双向链表,插入删除高效,不支持随机访问 | | **`deque`** | 双端队列 | 两端可高效插入删除的序列容器 | | **`stack`** | 栈 | 后进先出(LIFO)的容器适配器,底层基于deque/list[^4][^5] | | **`queue`** | 队列 | 先进先出(FIFO)的容器适配器[^4] | | **`priority_queue`**| 优先队列 | 元素按优先级出队,默认大顶堆[^4] | | **`set`** | 集合 | 有序不重复元素集合,基于红黑树实现[^2] | | **`map`** | 映射/字典 | 键值对容器,键唯一且有序 | | **`multiset`** | 多重集合 | 允许重复元素的集合 | | **`multimap`** | 多重映射 | 允许重复键的映射 | #### 核心说明: 1. **序列容器**(如vector/list)按物理顺序存储,关联容器(如set/map)按键自动排序[^3] 2. 容器适配器(stack/queue/priority_queue)基于底层容器实现接口约束[^4] 3. 所有容器通过迭代器($\text{iterator}$)与STL算法协同工作,例如: ```cpp std::vector<int> vec {1,2,3}; for(auto it = vec.begin(); it != vec.end(); ++it) { // auto自动推导迭代器类型[^3] std::cout << *it; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值