关联式容器概述
在 C++ STL 中,vector、list、deque 等属于序列式容器,底层是线性结构,存储的是元素本身。而关联式容器虽然也是用来存储数据,但它的核心在于**<key, value>结构的键值对**。这使得它在数据检索上比序列式容器效率更高,典型的如 set、map、unordered_set、unordered_map 等。
需要区分的是,stack、queue 和 priority_queue 属于容器适配器,它们默认的基础容器分别是 deque、vector 等,并不直接归类为关联式容器。
树形结构与哈希结构
根据应用场景不同,STL 实现了两种主要结构的关联式容器:
| 关联式容器 | 容器结构 | 底层实现 |
|---|---|---|
| set, map, multiset, multimap | 树型结构 | 平衡搜索树 (红黑树) |
| unordered_set, unordered_map... | 哈希结构 | 哈希表 |
树型结构中的元素是有序的,适合需要遍历有序数据的场景;哈希结构则是无序的,追求极致的查找速度。
键值对基础
键值对(Key-Value Pair)表示具有一一对应关系的结构,通常包含两个成员变量:key 代表索引或标识,value 表示与 key 对应的具体信息。这是关联式容器的核心存储单元。
Set 与 Multiset
Set 的使用
set 是按照特定次序存储元素的容器。在 set 中,元素的 value 同时也作为 key 存在,且每个 value 必须是唯一的。这意味着 set 中的元素不能在容器中修改(元素总是 const),但可以从容器中插入或删除。
内部而言,set 的元素总是按照比较对象(类型比较)指示的严格弱排序准则进行排序。由于底层基于二叉搜索树(通常是红黑树)实现,通过 key 访问单个元素的速度通常比 unordered_set 慢,但它允许根据顺序对子集进行直接迭代。
构造方式
#include <iostream>
#include <set>
#include <vector>
using namespace std;
void {
set<> s1;
vector<> v1 = { ,,,,,,,, };
;
;
( & element : s2) cout << element << ;
cout << endl;
(& element : s3) cout << element << ;
cout << endl;
}


