--- title: "区别" created: 2025-11-28 tags: - 算法 --- # 区别 在C++标准模板库(STL)中,`set`、`multiset`、`unordered_set`、`map`、`multimap`和`unordered_map`是常用的容器,它们在存储和处理数据时各有特点。以下是它们的主要区别: ### 1. `set` - **特点**:`set`是一个存储唯一键值的有序容器。它不允许存储重复的元素。 - **底层实现**:通常基于红黑树,元素按照特定顺序排序。 - **用途**:适用于需要有序不重复元素集合的场景。 ### 2. `multiset` - **特点**:与`set`类似,但它允许存储重复的元素。 - **底层实现**:同样基于红黑树,元素自动排序。 - **用途**:适用于需要有序可重复集合的场景。 ### 3. `unordered_set` - **特点**:存储唯一键值的无序容器,不允许重复元素。 - **底层实现**:基于哈希表,元素无序存储。 - **用途**:适用于追求高效插入、删除和查找操作的场景,不关心元素顺序。 ### 4. `map` - **特点**:存储键值对,键唯一,自动根据键排序。 - **底层实现**:通常基于红黑树。 - **用途**:当需要根据键快速查找值时使用,适合需要有序键值对的场景。 ### 5. `multimap` - **特点**:与`map`类似,但允许键重复,即一个键可以映射多个值。 - **底层实现**:基于红黑树,元素自动按键排序。 - **用途**:适用于需要将单个键映射到多个值的有序键值对集合场景。 ### 6. `unordered_map` - **特点**:存储键值对,键唯一,但存储无序。 - **底层实现**:基于哈希表。 - **用途**:当不需要元素排序,且追求高效的插入、删除和查找操作时使用。 ### 总结 - **有序与无序**:`set`、`multiset`、`map`、`multimap`是有序容器,根据元素或键的顺序自动排序;而`unordered_set`和`unordered_map`是无序容器,存储元素时不考虑顺序。 - **唯一与非唯一**:`set`和`unordered_set`只允许存储唯一元素,`map`和`unordered_map`的键是唯一的;而`multiset`和`multimap`允许存储重复的元素或键。 - **底层数据结构**:有序容器通常基于红黑树实现,保证了元素的有序性和较高的操作效率;无序容器基于哈希表实现,提供了快速的访问速度。 --- ⬅️ [[stl哈希|stl哈希]] 🏠 [[00-刷题理模型]] ➡️ [[不同的数|不同的数]]