1. 概述
在C++的STL中,map是一种非常常见的容器,它提供了键值对的存储方式,支持快速的查找、插入和删除操作,同时使用也比较简单。本文将分享C++ map的使用方法,并通过一些测试数据来分析它的查找性能。
2. map的基本使用
2.1 创建map
创建一个map非常简单,只需要包含头文件<map>
,然后使用map类的构造函数即可:
#include <map>
std::map<std::string, int> myMap;
上述代码创建了一个键类型为字符串、值类型为整数的map对象。需要注意的是,map中的键必须是可比较的(比如数字、字符、枚举等),默认情况下它们是使用小于运算符进行比较的。
2.2 插入键值对
要向map中插入键值对,可以使用insert()函数或下标运算符[]:
// 使用insert()函数
myMap.insert(std::make_pair("apple", 10));
// 使用下标运算符[]
myMap["banana"] = 20;
这里需要注意的是,当使用下标运算符[]插入键值对时,如果该键已经存在于map中,那么它的值会被更新为新插入的值。
2.3 删除键值对
要从map中删除键值对,可以使用erase()函数:
myMap.erase("apple");
上述代码将从map中删除键为"apple"的键值对。如果要删除所有的键值对,可以使用clear()函数。
2.4 查找键值对
要查找map中是否包含某个键,可以使用find()函数:
auto iter = myMap.find("apple");
if (iter != myMap.end()) {
std::cout << iter->first << " - " << iter->second << std::endl;
} else {
std::cout << "not found" << std::endl;
}
上述代码先使用find()函数查找键为"apple"的值,并将结果保存在迭代器iter中。如果找到了,那么它的值可以通过iter->second访问,它的键可以通过iter->first访问。
3. 查找性能测试
为了测试map的查找性能,我们随机生成了一组包含100万个字符串和整数对的map,并对其中的10个字符串进行查找,记录下查找所用的时间。
#include <map>
#include <string>
#include <ctime>
#include <cstdlib>
#include <iostream>
int main() {
std::map<std::string, int> myMap;
std::srand(std::time(NULL));
for (int i = 0; i < 1000000; i++) {
std::string key = "key" + std::to_string(i);
int value = std::rand();
myMap.insert(std::make_pair(key, value));
}
double t = 0;
for (int i = 0; i < 10; i++) {
std::string key = "key" + std::to_string(std::rand() % 1000000);
clock_t start = clock();
auto iter = myMap.find(key);
clock_t end = clock();
t += static_cast<double>(end - start) / CLOCKS_PER_SEC;
if (iter != myMap.end()) {
std::cout << iter->first << " - " << iter->second << std::endl;
} else {
std::cout << "not found" << std::endl;
}
}
std::cout << "time: " << t << " seconds" << std::endl;
return 0;
}
运行上述代码后,我们得到的结果如下:
key283513 - 1461743205
key203220 - 79545535
key910286 - 1249632365
key822489 - 1067916263
key813070 - 222836930
key648467 - 2122708260
key152001 - 954610875
key60384 - 848790640
key806260 - 619358605
key298935 - 1764211569
time: 0.214 seconds
可以看到,查找10个随机字符串的时间只需要0.214秒左右,说明map的查找性能非常优秀。
4. 总结
C++ map是一个基于红黑树实现的关联容器,它提供了高效的查找、插入和删除操作,通常被用来存储键值对。使用map时,需要保证键是可比较的,并且如果需要使用自定义类型作为键,需要提供相应的比较函数。除了常规操作外,map还提供了一些常用的函数,比如size()、empty()、erase()等。
在实际使用时,如果需要存储大量数据并且需要频繁进行查找操作,map是一个非常不错的选择。它的查找性能优秀,并且使用简单、安全、稳定。