关联式容器概述
在 C++ STL 中,vector、list、deque 等通常被称为序列式容器,因为它们底层是线性结构,存储的是元素本身。而关联式容器则不同,它们内部存储的是 <key, value> 结构的键值对。这种设计使得数据检索效率往往比序列式容器更高,常见的如 set、map、unordered_set、unordered_map 等。
需要注意的是,stack、queue 和 priority_queue 属于容器适配器,它们默认使用的基础容器分别是 deque、vector 等,不属于关联式容器范畴。
树形结构与哈希结构
根据应用场景的不同,C++ 的关联式容器主要分为两种底层实现结构:
| 关联式容器 | 容器结构 | 底层实现 |
|---|---|---|
| set、map、multiset、multimap | 树型结构 | 平衡搜索树 (红黑树) |
| unordered_set、unordered_map、unordered_multiset、unordered_multimap | 哈希结构 | 哈希表 |
其中,树型结构容器中的元素是有序的序列,而哈希结构容器中的元素是无序的。
键值对基础
键值对(Key-Value Pair)是一种具有一一对应关系的结构,一般包含两个成员变量:key 代表键值,value 表示与 key 对应的信息。这是关联式容器的核心数据单元。
Set 与 Multiset
Set 的核心特性
set 是按照一定次序存储元素的容器。在 set 中,元素的 value 也标识它本身(即 value 就是 key),且每个 value 必须是唯一的。set 中的元素不能在容器中修改(元素总是 const),但可以从容器中插入或删除。底层是用二叉搜索树(红黑树)实现的。
模板参数与构造
#include <iostream>
#include <set>
#include <vector>
using namespace std;
void TestConstructor() {
// 构造空的 set
set<int> s1;
// 迭代器区间构造,自动去重
vector<int> v1 = { 1,2,3,4,5,,,, };
;
;
(& element : s2) cout << element << ;
cout << endl;
(& element : s3) cout << element << ;
cout << endl;
}


