当前位置:首页 > 科技  > 软件

C++ STL之std::map:红黑树的魔法与性能测试

来源: 责编: 时间:2023-11-21 17:13:22 551观看
导读最近在使用C++写代码,也是刚接触C++,恰巧碰到一个需要使用map的地方,不知道其查找元素的性能怎么样,所以研究了下,做个记录,目前从x86平台测试map查找一个元素大概需要2us,这里你需要考虑在自身硬件平台比如arm,做一些cpu加压

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

9EG28资讯网——每日最新资讯28at.com

在C++编程的世界中,STL(标准模板库)一直以其强大的数据结构和算法而著称。其中,std::map是STL提供的一个关联容器,它的核心是红黑树(Red-Black Tree)数据结构。红黑树是一种自平衡的二叉查找树,以其出色的性能和平衡机制而备受推崇。9EG28资讯网——每日最新资讯28at.com

本文将深入探讨std::map以及其核心红黑树的原理,解释其关键特性,包括插入、查找和删除操作,以及有序性的优势。我们还将进行性能测试,以展示std::map在实际应用中的卓越性能。9EG28资讯网——每日最新资讯28at.com

一、红黑树,std::map的核心

std::map的核心数据结构是红黑树(Red-Black Tree)数据结构。红黑树是一种自平衡二叉查找树,它具有以下特性:9EG28资讯网——每日最新资讯28at.com

  • 每个节点是红色或黑色:每个节点都被标记为红色或黑色,这是红黑树的基本性质之一。
  • 根节点是黑色:树的根节点始终是黑色的。
  • 每个叶子节点(NIL节点,通常表示为黑色)都被认为是黑色的:NIL节点是树的末端节点,它们通常被表示为黑色。
  • 如果一个节点是红色的,那么它的子节点必须是黑色的:这一性质确保没有两个相邻的红色节点。
  • 从任何给定节点到其后代叶子节点的每条路径都包含相同数量的黑色节点:这个性质保证了树的平衡。

这些性质保证了红黑树的平衡性,使得树的高度保持相对较小,从而提供了高效的查找、插入和删除操作。9EG28资讯网——每日最新资讯28at.com

二、std::map常见操作

1.插入操作:保持平衡

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

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

在插入操作中,红黑树遵循一些规则,例如:9EG28资讯网——每日最新资讯28at.com

  • 新插入的节点通常是红色的。
  • 如果插入破坏了红黑树的性质,就需要执行旋转和着色操作来恢复平衡。

9EG28资讯网——每日最新资讯28at.com

2.查找操作:速度与效率

std::map的查找操作非常高效,因为红黑树的结构使得它可以迅速定位到所需的节点。查找操作会从根节点开始,根据键值比较逐步沿树向下移动,直到找到目标节点或确定目标节点不在树中。这个过程的时间复杂度是O(log N),其中N是树中元素的数量。9EG28资讯网——每日最新资讯28at.com

// 查找操作示例auto result = myMap.find(42);if (result != myMap.end()) {    std::cout << "Found: " << result->second << std::endl;} else {    std::cout << "Not found!" << std.endl;}

9EG28资讯网——每日最新资讯28at.com

3.删除操作:平衡的维护

删除操作也是相对复杂的,因为它需要保持树的平衡。当删除一个节点时,可能会引起树的不平衡,需要执行旋转和着色操作来修复它。这些操作确保了红黑树的性质仍然得以维持。9EG28资讯网——每日最新资讯28at.com

// 删除操作示例myMap.erase(42);

在删除操作中,红黑树也遵循一系列规则,包括:9EG28资讯网——每日最新资讯28at.com

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

9EG28资讯网——每日最新资讯28at.com

4.有序性:按键排序

std::map中的元素是按键值有序排列的,这意味着您可以使用迭代器来遍历元素,或者进行范围查找。9EG28资讯网——每日最新资讯28at.com

// 使用迭代器遍历示例for (const auto& pair : myMap) {    std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}

三、性能测试:查找操作

下面是一个性能测试示例,因为我对查找某个元素的性能是有要求的,所以做了一个简单测试:9EG28资讯网——每日最新资讯28at.com

#include <iostream>#include <map>#include <random>#include <chrono>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个随机键值对,然后执行查找操作,并记录查找到的元素数量,并计算时间。9EG28资讯网——每日最新资讯28at.com

使用g++编译执行结果:9EG28资讯网——每日最新资讯28at.com

9EG28资讯网——每日最新资讯28at.com

四、总结

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

本文链接:http://www.28at.com/showinfo-26-32434-0.htmlC++ STL之std::map:红黑树的魔法与性能测试

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 21个优秀开源网络爬虫库,适合Python、Java、Go、JavaScript开发语言

下一篇: C语言代码:数字雨

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
Top