C++std::map的红黑树原理及性能测试

一起学嵌入式 2023-10-31 08:10

引言

最近在使用C++写代码,也是刚接触C++,恰巧碰到一个需要使用map的地方,不知道其查找元素的性能怎么样,所以研究了下,做个记录,目前从x86平台测试map查找一个元素大概需要2us,这里你需要考虑在自身硬件平台比如arm,做一些cpu加压情况下再查看map效率以评估map是否满足业务需求。

在C++编程的世界中,STL(标准模板库)一直以其强大的数据结构和算法而著称。其中,std::map是STL提供的一个关联容器,它的核心是红黑树(Red-Black Tree)数据结构。红黑树是一种自平衡的二叉查找树,以其出色的性能和平衡机制而备受推崇。
本文将深入探讨std::map以及其核心红黑树的原理,解释其关键特性,包括插入、查找和删除操作,以及有序性的优势。我们还将进行性能测试,以展示std::map在实际应用中的卓越性能。

扫描关注一起学嵌入式,一起学习,一起成长


红黑树,std::map的核心

std::map的核心数据结构是红黑树(Red-Black Tree)数据结构。红黑树是一种自平衡二叉查找树,它具有以下特性:

  • 每个节点是红色或黑色:每个节点都被标记为红色或黑色,这是红黑树的基本性质之一。

  • 根节点是黑色:树的根节点始终是黑色的。

  • 每个叶子节点(NIL节点,通常表示为黑色)都被认为是黑色的:NIL节点是树的末端节点,它们通常被表示为黑色。

  • 如果一个节点是红色的,那么它的子节点必须是黑色的:这一性质确保没有两个相邻的红色节点。

  • 从任何给定节点到其后代叶子节点的每条路径都包含相同数量的黑色节点:这个性质保证了树的平衡。

这些性质保证了红黑树的平衡性,使得树的高度保持相对较小,从而提供了高效的查找、插入和删除操作。

std::map常见操作

入操作:保持平衡

当您向std::map插入新的键值对时,红黑树需要进行一系列旋转和着色操作,以保持树的平衡。这确保了即使在大规模数据集下,插入操作仍然高效。

// 插入操作示例std::map<int, std::string> myMap;myMap[42] = "Hello, World!";

在插入操作中,红黑树遵循一些规则,例如:

  • 新插入的节点通常是红色的。
  • 如果插入破坏了红黑树的性质,就需要执行旋转和着色操作来恢复平衡。
查找操作:速度与效率
std::map的查找操作非常高效,因为红黑树的结构使得它可以迅速定位到所需的节点。查找操作会从根节点开始,根据键值比较逐步沿树向下移动,直到找到目标节点或确定目标节点不在树中。这个过程的时间复杂度是O(log N),其中N是树中元素的数量。
// 查找操作示例auto result = myMap.find(42);if (result != myMap.end()) {    std::cout << "Found: " << result->second << std::endl;} else {    std::cout << "Not found!" << std.endl;}

删除操作:平衡的维护
删除操作也是相对复杂的,因为它需要保持树的平衡。当删除一个节点时,可能会引起树的不平衡,需要执行旋转和着色操作来修复它。这些操作确保了红黑树的性质仍然得以维持。
// 删除操作示例myMap.erase(42);

在删除操作中,红黑树也遵循一系列规则,包括:

  • 如果删除的节点是红色的,可能不会破坏树的性质。

  • 如果删除的节点是黑色的,就可能会引发平衡问题,需要执行一系列的操作来修复。


有序性:按键排序

std::map中的元素是按键值有序排列的,这意味着您可以使用迭代器来遍历元素,或者进行范围查找。
// 使用迭代器遍历示例for (const auto& pair : myMap) {    std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}

性能测试:查找操作

下面是一个性能测试示例,因为我对查找某个元素的性能是有要求的,所以做了一个简单测试:
#include #include #include #include 
int main() { std::map<int, int> testMap; std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<int> dist(1, 1000000);
// 插入100,000个随机键值对 for (int i = 0; i < 100000; ++i) { int key = dist(gen); int value = i; testMap[key] = value; }
// 测试查找操作的效率 int totalIterations = 100000; int foundCount = 0; std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < totalIterations; ++i) { int key = dist(gen); if (testMap.find(key) != testMap.end()) { foundCount++; } }
std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> duration = std::chrono::duration_cast<std::chrono::duration<double>>(end - start);
std::cout << "查找 " << totalIterations << " 个元素所用时间: " << duration.count() << " 秒" << std::endl; std::cout << "找到 " << foundCount << " 个元素" << std::endl; std::cout << "查找单个元素耗时: " << (duration.count()*1000000) / totalIterations << " 微秒" << std::endl;
return 0;}
我们首先插入了100,000个随机键值对,然后执行查找操作,并记录查找到的元素数量,并计算时间。
使用g++编译执行结果:

总结

std::map是C++编程中的神奇工具,它提供高效的查找、插入和删除操作,并按键排序数据。红黑树的自平衡性确保了它在各种操作下都能保持高效性。
无论是实现关键功能还是性能测试,std::map都展现了其出色之处,使其成为处理大规模数据集的理想之选。


关注我【一起学嵌入式】,一起学习,一起成长。


觉得文章不错,点击“分享”、“”、“在看” 呗!

一起学嵌入式 公众号【一起学嵌入式】,RTOS、Linux编程、C/C++,以及经验分享、行业资讯、物联网等技术知
评论
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 111浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 86浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 135浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 131浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 103浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 134浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 104浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 121浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 88浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 153浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 88浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦