map
是 C++ STL (Standard Template Library) 中的一种关联容器,用于存储键值对(key-value pairs)。每个键(key)在 map
中都是唯一的,并且键值对会根据键的值进行排序(默认为升序)。map
的内部实现通常为红黑树,因此它提供了高效的插入、删除和查找操作。
主要特点
- 键的唯一性:每个键在
map
中都是唯一的。 - 排序:键值对根据键的值进行排序,默认为升序。
- 高效查找:插入、删除和查找操作的时间复杂度均为 O(log n)。
- 双向迭代器:可以使用双向迭代器来遍历
map
容器中的元素。
常用操作
定义和初始化
#include <map>
std::map<std::string, int> m; // 创建一个空的 map 容器
std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}}; // 初始化 map 容器
插入元素
m["orange"] = 3; // 插入键值对
m.insert({"grape", 4}); // 插入键值对
m.insert(std::make_pair("lemon", 5)); // 插入键值对
删除元素
m.erase("apple"); // 删除键为 "apple" 的键值对
m.erase(m.begin()); // 删除第一个键值对
查找元素
auto it = m.find("banana"); // 查找键为 "banana" 的键值对,返回指向该键值对的迭代器,如果找不到则返回 end()
if (it != m.end()) {
std::cout << "Found " << it->first << ": " << it->second << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
检查元素是否存在
if (m.count("banana")) {
std::cout << "banana is in the map." << std::endl;
} else {
std::cout << "banana is not in the map." << std::endl;
}
获取元素数量
std::cout << "The map has " << m.size() << " key-value pairs." << std::endl;
清空容器
m.clear(); // 清空 map 容器
遍历容器
for (const auto& pair : m) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 或者使用迭代器
for (auto it = m.begin(); it != m.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
自定义比较函数
如果你想改变 map
中键的排序方式,可以提供一个自定义的比较函数或对象。例如,如果你想要创建一个键按降序排序的 map
,你可以这样做:
#include <map>
#include <functional>
std::map<std::string, int, std::greater<std::string>> descendingMap; // 创建一个键按降序排序的 map
或者使用自定义的比较类:
struct CustomCompare {
bool operator()(const std::string& a, const std::string& b) const {
return a > b; // 降序排序
}
};
std::map<std::string, int, CustomCompare> customMap;
总结
map
是一个非常有用的数据结构,当你需要存储唯一键及其对应的值,并且希望这些键值对是有序的时,它是一个很好的选择。由于它的内部实现,map
提供了高效的插入、删除和查找操作。map
在许多应用场景中都非常有用,例如字典、配置文件解析等。