C/C++ STL Map与MultiMap详解

5星 · 超过95%的资源 需积分: 9 7 下载量 101 浏览量 更新于2024-07-31 收藏 232KB PDF 举报
"C/C++ STL 中的 map 和 multimap 容器详解" 在 C++ 的标准模板库(Standard Template Library, STL)中,`map` 和 `multimap` 是两种非常重要的关联容器,它们用于存储键值对(key-value pairs)。这两种容器的主要区别在于处理键值对的唯一性:`map` 不允许重复的键,而 `multimap` 允许键的重复。 1. **map** - `map` 是一个有序的关联容器,它将唯一的键映射到相应的值。这意味着对于给定的键,`map` 只会存储一个对应的值。键和值的类型由模板参数定义,键的类型用于排序元素。 - `map` 的实现基于红黑树(Red-Black Tree),保证了插入、删除和查找操作的时间复杂度为 O(log n)。 - 示例: ```cpp std::map<std::string, int> myMap; myMap["apple"] = 1; // 插入键值对 int val = myMap["apple"]; // 查找键对应的值 ``` 2. **multimap** - `multimap` 类似于 `map`,但它允许键的重复。每个键可以对应多个值。 - 在 `multimap` 中,查找特定键的结果是一个迭代器范围,表示所有与该键相关联的值。 - 示例: ```cpp std::multimap<std::string, int> myMultiMap; myMultiMap.insert({"apple", 1}); myMultiMap.insert({"apple", 2}); // 可以插入相同的键 auto range = myMultiMap.equal_range("apple"); // 获取键为"apple"的所有值 ``` 3. **模板参数** - `Key`: 键的类型,必须是可比较的,通常用 `less<Key>` 作为默认比较函数,可以自定义比较函数以满足特定排序需求。 - `T`: 值的类型,可以是任意类型。 - `Compare`: 比较函数对象的类型,默认为 `less<Key>`,用于决定元素的顺序。 - `Allocator`: 分配器的类型,负责内存管理,默认为 `allocator<pair<const Key, T>>`。 4. **操作方法** - 插入元素:`insert` 函数用于插入新的键值对。 - 查找元素:`find` 返回指定键的第一个匹配项的迭代器;`count` 返回具有指定键的元素数量。 - 删除元素:`erase` 函数用于删除特定键值对或迭代器指定的元素。 - 访问元素:`operator[]` 直接访问键对应的值,如果没有则自动插入;`at` 方法在不存在键时抛出异常。 5. **迭代器** - `map` 和 `multimap` 提供了迭代器,可以用它们遍历容器中的键值对。例如,`begin()` 和 `end()` 返回迭代器的开始和结束位置。 6. **应用示例** - `map` 通常用于创建索引,如字典查找或数据库索引,确保键的唯一性。 - `multimap` 则适用于需要根据相同键存储多个值的情况,如统计词频或用户偏好记录。 7. **性能考虑** - 当关注内存效率时,应权衡 `map` 和 `multimap` 的大小,因为每个键值对都会占用额外的空间来存储键的副本。 - 如果键类型为自定义类,考虑重载 `operator<` 或提供比较函数,以优化排序性能。 `map` 和 `multimap` 是 C++ 中非常实用的数据结构,它们提供了高效且灵活的方式来管理和操作键值对。理解它们的特性和使用场景对于编写高质量的 C++ 代码至关重要。