案例分享c++ map的使用和 查找性能测试

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是一个非常不错的选择。它的查找性能优秀,并且使用简单、安全、稳定。

后端开发标签