基本用法
map
是 C++ 标准模板库(STL)中的关联容器,用于存储键值对(key-value pairs),其中每个键是唯一的。键值对按照键的顺序自动排序。
声明与初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <iostream> #include <map>
int main() { std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "one")); myMap[2] = "two";
std::cout << myMap[1] << std::endl; std::cout << myMap.at(2) << std::endl;
return 0; }
|
特点和注意事项
- 有序性:
map
中的元素按照键自动排序,默认情况下使用 <
运算符进行比较。可以自定义比较器来改变排序规则。
- 唯一性:
map
中的每个键都是唯一的。如果插入一个已存在的键,则会覆盖原有的值。
- 复杂度:
map
的查找、插入和删除操作的平均时间复杂度为 O(log n),这是因为它通常是用红黑树(Red-Black Tree)实现的。
- 内存占用:相比于
unordered_map
,map
由于维护了元素的有序性,通常占用更多的内存和有略低的性能。
示例代码
以下是一个更详细的 map
使用示例,包括遍历、查找和删除操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <iostream> #include <map>
int main() { std::map<std::string, int> ageMap;
ageMap["Alice"] = 30; ageMap["Bob"] = 25; ageMap["Charlie"] = 35;
for (const auto& pair : ageMap) { std::cout << pair.first << ": " << pair.second << std::endl; }
auto it = ageMap.find("Bob"); if (it != ageMap.end()) { std::cout << "Found Bob, age: " << it->second << std::endl; } else { std::cout << "Bob not found" << std::endl; }
ageMap.erase("Alice");
if (ageMap.count("Alice") == 0) { std::cout << "Alice has been removed" << std::endl; }
return 0; }
|
总结
map
是一个强大且灵活的关联容器,适用于需要自动排序键值对的场景。其有序性和高效的查找、插入、删除操作使其在许多应用中非常有用。但在使用时需要注意其相对较高的内存占用和略低的性能。