c/c++ stl_map
### C/C++ STL Map #### 一、简介与基本概念 `std::map` 和 `std::multimap` 是 C++ 标准模板库 (STL) 中非常重要的容器类型,用于存储键值对(key-value pairs)。这些容器能够根据其键自动排序元素,并且提供高效的查找操作。 #### 二、基本特性 1. **自动排序**:`std::map` 和 `std::multimap` 会根据键进行自动排序。 2. **唯一性**:`std::map` 中不允许有重复的键,而 `std::multimap` 则允许。 3. **键与值**:每个元素都包含一个键和一个值,键用于排序,而值则不参与排序。 4. **键的比较**:默认情况下使用 `<` 运算符来比较键,可以通过第三个模板参数自定义排序规则。 5. **内存管理**:提供了可选的内存管理模型,默认使用 C++ 标准库提供的分配器。 #### 三、模板参数详解 - **`Key`**:键的类型。 - **`T`**:值的类型。 - **`Compare`**:可选参数,定义了键的排序准则,默认为 `std::less<Key>`。 - **`Allocator`**:可选参数,定义了元素的内存管理模型,默认为 `std::allocator<std::pair<const Key, T>>`。 #### 四、使用示例 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap; // 插入元素 myMap[1] = "one"; myMap[2] = "two"; myMap[3] = "three"; // 输出所有元素 for (const auto &item : myMap) { std::cout << item.first << ": " << item.second << std::endl; } return 0; } ``` #### 五、内部实现与性能分析 1. **内部结构**:`std::map` 和 `std::multimap` 内部通常使用红黑树实现,保证了对数级别的查找效率。 2. **时间复杂度**: - 查找:O(log n) - 插入:O(log n) - 删除:O(log n) #### 六、常用成员函数 1. **`insert()`**:插入元素。 2. **`find()`**:查找元素。 3. **`erase()`**:删除元素。 4. **`count()`**:统计特定键的数量。 5. **`begin()`** 和 **`end()`**:获取迭代器。 6. **`empty()`**:检查容器是否为空。 7. **`size()`**:返回容器大小。 8. **`clear()`**:清空容器。 #### 七、注意事项 1. **键不可修改**:一旦元素被插入到 `std::map` 或 `std::multimap` 中,它的键就无法被修改。 2. **自定义排序**:如果键类型不是内置类型,需要提供自定义的比较函数或比较对象。 3. **内存管理**:可以通过第四模板参数提供自定义的分配器,这对于处理大量数据时尤为重要。 #### 八、`std::multimap` 特点 1. **允许重复的键**:这是 `std::multimap` 与 `std::map` 最大的区别。 2. **应用场景**:当需要存储具有相同键但不同值的数据时,使用 `std::multimap` 更为合适。 3. **遍历**:遍历 `std::multimap` 中具有相同键的所有元素,可以使用 `lower_bound()` 和 `upper_bound()` 成员函数。 #### 九、示例代码对比 下面通过一个简单的例子来展示 `std::map` 和 `std::multimap` 的使用: ```cpp #include <iostream> #include <map> #include <multimap> void printMap(const std::map<int, std::string>& map) { for (const auto &item : map) { std::cout << item.first << ": " << item.second << std::endl; } } void printMultimap(const std::multimap<int, std::string>& multimap) { for (const auto &item : multimap) { std::cout << item.first << ": " << item.second << std::endl; } } int main() { std::map<int, std::string> myMap; std::multimap<int, std::string> myMultimap; // 插入元素 myMap[1] = "one"; myMap[2] = "two"; myMap[3] = "three"; myMultimap.insert({1, "one"}); myMultimap.insert({1, "first"}); myMultimap.insert({2, "second"}); std::cout << "Map contents:" << std::endl; printMap(myMap); std::cout << "\nMultimap contents:" << std::endl; printMultimap(myMultimap); return 0; } ``` 以上示例展示了如何使用 `std::map` 和 `std::multimap` 存储和访问数据。可以看到,`std::map` 中键是唯一的,而 `std::multimap` 可以存储多个具有相同键的元素。 `std::map` 和 `std::multimap` 提供了强大且灵活的键值对管理功能,适用于多种应用场景。理解它们的基本特性和用法对于高效编程至关重要。