C++ std::map使用详解
什么是std::map
std::map
是C++标准库中提供的一个关联容器,它提供了一种将键和值进行映射的功能。std::map
中的键是唯一的,而值可以重复。std::map
内部使用红黑树(red-black tree)实现,所以它的插入、删除和查找操作的时间复杂度都是O(log n)。
在使用 std::map
之前,需要包含头文件 <map>
。
使用std::map
定义和初始化
可以通过以下方式定义一个 std::map
对象:
std::map<Key, Value> myMap;
其中,Key
是键的类型,Value
是值的类型。例如,如果我们要创建一个 std::map
,其中的键是 int
类型,值是 std::string
类型,可以这样定义:
std::map<int, std::string> myMap;
插入元素
使用 insert()
函数可以向 std::map
中插入键值对。示例代码如下:
myMap.insert(std::pair<int, std::string>(1, "Apple"));
以上代码将一个键为 1
,值为 “Apple” 的键值对插入到 std::map
中。也可以使用 []
运算符插入元素:
myMap[2] = "Banana";
使用 []
运算符时,如果 std::map
中已经存在相同的键,则会将原有键值对替换为新的键值对。
访问元素
可以使用 []
运算符或 at()
函数来访问 std::map
中的元素。例如,要访问键为 1
的值,可以使用以下代码:
std::string value = myMap[1];
或者使用 at()
函数:
std::string value = myMap.at(1);
使用 []
运算符访问不存在的键会导致该键被添加到 std::map
中,并将值初始化为默认值。而使用 at()
函数访问不存在的键会抛出 std::out_of_range
异常。
删除元素
使用 erase()
函数可以删除 std::map
中的元素。示例代码如下:
myMap.erase(1);
以上代码将键为 1
的键值对从 std::map
中删除。也可以使用迭代器来删除元素:
std::map<int, std::string>::iterator it = myMap.find(2);
if (it != myMap.end()) {
myMap.erase(it);
}
使用 find()
函数来查找指定键的迭代器,如果找到则删除。
遍历元素
可以使用迭代器来遍历 std::map
中的元素。以下是一个示例代码:
for (std::map<int, std::string>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
}
以上代码会依次输出 std::map
中的每个键值对。
std::map的排序
std::map
默认按照键的升序进行排序。如果需要按照其他方式进行排序,可以自定义排序规则。以下是一个根据值降序排序的示例代码:
struct CompareByValue {
bool operator()(const std::pair<int, std::string>& left, const std::pair<int, std::string>& right) {
return left.second > right.second;
}
};
std::map<int, std::string, CompareByValue> myMap;
在上述代码中,CompareByValue
是一个自定义的比较函数对象,用于指定排序规则。std::map
的第三个模板参数为比较函数对象。
查找元素
可以使用 count()
函数或 find()
函数来查找元素。例如,要检查 std::map
中是否存在键为 1
的元素,可以使用以下代码:
if (myMap.count(1) != 0) {
std::cout << "Key 1 exists!" << std::endl;
}
使用 count()
函数返回指定键的数量,如果存在则返回1,否则返回0。find()
函数返回指向指定元素的迭代器,如果找不到则返回 end()
。
示例代码
以下是一个完整的示例代码,演示了 std::map
的基本使用方法:
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap;
myMap.insert(std::pair<int, std::string>(1, "Apple"));
myMap[2] = "Banana";
myMap.insert(std::make_pair(3, "Carrot"));
std::cout << "Map size: " << myMap.size() << std::endl;
std::map<int, std::string>::iterator it = myMap.find(2);
if (it != myMap.end()) {
myMap.erase(it);
}
// 遍历元素
for (std::map<int, std::string>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
}
return 0;
}
运行结果:
Map size: 3
Key: 1, Value: Apple
Key: 3, Value: Carrot
以上示例代码中,首先创建了一个 std::map
对象 myMap
,然后向其中插入了三个键值对。接着使用 find()
函数找到键为 2
的元素,并将其删除。最后使用迭代器遍历 std::map
中的元素,并输出每个键值对的键和值。
总结
std::map
是一个非常强大的关联容器,提供了键值对的映射功能,并且内部使用红黑树实现,具有较好的性能。使用 std::map
可以方便地进行插入、删除、查找和遍历操作。同时,还可以自定义排序规则来满足不同的需求。在实际项目中,合理使用 std::map
可以提高代码的可读性和性能。