c++容器概述



c++容器:

有了对数据结构的基本认识,那么对高级语言所提出的容器的概念就很容易理解。下面我们就来了解一下C++ 标准模板库(STL) 提所供的10 种通用容器。

什么是容器

首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是“容器类是一种对特定代码重用问题的良好的解决方案”。

容器还有另一个特点是容器可以自行扩展。在解决问题时我们常常不知道我们需要存储多少个对象,也就是说我们不知道应该创建多大的内存空间来保存我们的对象。显然,数组在这一方面也力不从心。容器的优势就在这里,它不需要你预先告诉它你要存储多少对象,只要你创建一个容器对象,并合理的调用它所提供的方法,所有的处理细节将由容器来自身完成。它可以为你申请内存或释放内存,并且用最优的算法来执行您的命令。

容器是随着面向对象语言的诞生而提出的,容器类在面向对象语言中特别重要,甚至它被认为是早期面向对象语言的基础。在现在几乎所有的面向对象的语言中也都伴随着一个容器集,在C++ 中,就是标准模板库(STL )。

和其它语言不一样,C++ 中处理容器是采用基于模板的方式。标准C++ 库中的容器提供了多种数据结构,这些数据结构可以与标准算法一起很好的工作,这为我们的软件开发提供了良好的支持!

通用容器的分类

STL 对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。

顺序性容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。

关联式容器 和顺序性容器不一样,关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。

关联式容器另一个显著的特点是它是以键值的方式来保存数据,就是说它能把关键字和值关联起来保存,而顺序性容器只能保存一种(可以认为它只保存关键字,也可以认为它只保存值)。这在下面具体的容器类中可以说明这一点。

容器适配器 是一个比较抽象的概念, C++ 的解释是:适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器是让一种已存在的容器类型采用另一种不同的抽象类型的工作方式来实现的一种机制。其实仅是发生了接口转换。那么你可以把它理解为容器的容器,它实质还是一个容器,只是他不依赖于具体的标准容器类型,可以理解是容器的模版。或者把它理解为容器的接口,而适配器具体采用哪种容器类型去实现,在定义适配器的时候可以由你决定。

下表列出STL 定义的三类容器所包含的具体容器类:



### C++ 容器概述 C++ 标准模板库(STL)中的容器是一系列预定义的数据结构,旨在简化程序员的工作并提高代码效率。这些容器可以分为三类:序列容器、关联容器和无序容器[^1]。 #### 序列容器 序列容器按照线性顺序存储元素,支持随机访问或迭代访问。以下是常见的几种序列容器及其特点: - **`std::vector`**: 动态数组,允许动态调整大小,支持快速随机访问,但在中间插入或删除元素时性能较差[^2]。 ```cpp std::vector<int> vec = {1, 2, 3}; vec.push_back(4); // 添加新元素到末尾 ``` - **`std::array`**: 固定大小的数组,适用于已知固定数量元素的情况[^1]。 ```cpp std::array<int, 3> arr = {1, 2, 3}; int value = arr.at(0); // 访问第一个元素 ``` - **`std::list`**: 双向链表,适合频繁插入和删除操作,但不支持随机访问[^1]。 ```cpp std::list<std::string> lst; lst.emplace_front("first"); // 插入到头部 ``` - **`std::deque`**: 双端队列,两端都可以高效地插入和删除元素[^1]。 ```cpp std::deque<double> dq; dq.push_back(1.5); dq.push_front(-1.5); ``` #### 关联容器 关联容器通过键值对的方式存储数据,并保持内部有序。主要特点是查找速度快,通常基于平衡二叉树实现。 - **`std::set`**: 存储唯一的关键字集合,自动按升序排列。 ```cpp std::set<int> s = {3, 1, 2}; auto it = s.find(2); // 查找是否存在某个关键字 ``` - **`std::map`**: 键值映射关系,键唯一且有序。 ```cpp std::map<std::string, int> m; m["apple"] = 1; // 插入键值对 ``` #### 无序容器 无序容器也采用键值对形式存储数据,不过其底层实现依赖哈希表而非红黑树,因此查询速度更快,但无法保证元素间的顺序。 - **`std::unordered_set`**: 类似于 `std::set`,但是没有固定的排序规则。 ```cpp std::unordered_set<char> us = {'a', 'b'}; bool found = (us.count('c') > 0); // 判断是否包含特定字符 ``` - **`std::unordered_map`**: 提供高效的平均时间复杂度 O(1) 的查找能力。 ```cpp std::unordered_map<std::string, double> um; um["pi"] = 3.14159; ``` 以上是对 C++ STL 中常用容器的一个概括说明,每种容器都有各自的优势与局限,在实际应用过程中应根据具体需求合理选用相应的容器类型[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值