在C++中,std::map 和 std::multimap 是两种关联容器,它们包含了可重复的(对于 multimap)或唯一的(对于 map)键值对。这些容器都根据它们的键自动排序,并允许非常快速地根据键查找、插入和删除元素。
std::map 是一个关联容器,它包含可以重复的键值对(但每个键必须是唯一的),并默认按照升序对键进行排序。
基本用法:
- #include
- #include
-
- int main() {
- std::map<int, std::string> myMap;
-
- // 插入元素
- myMap[1] = "one";
- myMap[2] = "two";
- myMap[3] = "three";
-
- // 遍历元素
- for (const auto& pair : myMap) {
- std::cout << pair.first << ": " << pair.second << std::endl;
- }
-
- // 查找元素
- auto it = myMap.find(2);
- if (it != myMap.end()) {
- std::cout << "Found " << it->first << ": " << it->second << std::endl;
- }
-
- return 0;
- }
std::multimap 是一个关联容器,它包含可以重复的键值对,并默认按照升序对键进行排序。
基本用法:
- #include
- #include
-
- int main() {
- std::multimap<int, std::string> myMultimap;
-
- // 插入元素
- myMultimap.insert({1, "one"});
- myMultimap.insert({2, "two"});
- myMultimap.insert({2, "two again"}); // 注意:键可以重复
- myMultimap.insert({3, "three"});
-
- // 遍历元素
- for (const auto& pair : myMultimap) {
- std::cout << pair.first << ": " << pair.second << std::endl;
- }
-
- // 查找元素(注意:对于multimap,find只返回第一个匹配的元素)
- auto range = myMultimap.equal_range(2);
- for (auto it = range.first; it != range.second; ++it) {
- std::cout << "Found " << it->first << ": " << it->second << std::endl;
- }
-
- return 0;
- }
在
std::multimap(以及std::multiset)中,equal_range是一个特别有用的成员函数,用于查找具有给定键的所有元素的范围。由于multimap允许键重复,因此单个键可能对应多个值。equal_range返回一个pair,其中pair.first是指向第一个不小于(即等于或大于)给定键的元素的迭代器,而pair.second是指向第一个大于给定键的元素的迭代器。因此,范围[pair.first, pair.second)包含了所有键等于给定键的元素。
std::map 和 std::multimap 使用 std::less 作为比较对象,这会导致键按照升序排序。你可以通过提供自定义的比较对象来改变排序方式。std::map 和 std::multimap 的迭代器是双向迭代器,它们可以向前或向后遍历容器。std::map 和 std::multimap 中的平均时间复杂度都是对数级别的(O(log n)),这使得它们在处理大量数据时非常高效。