关联式容器概述
C++ STL 里的 vector、list、deque 这类容器,存的是元素本身,结构上也更接近一条线。关联式容器不一样,它们围绕 key 来组织数据,常见的是 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 查值,哈希通常更省事。
键值对
键值对(Key-Value Pair)就是一组一一对应的数据,通常包含两个成员:key 和 value。对 map 这类容器来说,key 负责定位和排序,value 负责保存业务数据。关联式容器的核心就是它。
Set 与 Multiset
Set 的特点
set 按照一定顺序存储元素,元素本身就是 key。它要求元素唯一,插入重复值时会被直接忽略。底层是红黑树,所以遍历出来的结果也是有序的。
set 里的元素不能直接修改。严格一点说,元素类型是 const,你只能插入、删除,不能原地改值。这是为了保证树的有序性不被破坏。
构造方式
#include <iostream>
#include <set>
#include <vector>
using namespace std;
void TestConstructor() {
// 构造空的 set
set<int> s1;
vector<> v1 = { ,,,,,,,, };
;
;
(& element : s2) cout << element << ;
cout << endl;
(& element : s3) cout << element << ;
cout << endl;
}

