首页 > 编程语言 >c++map 查找元素和list查找元素速度对比

c++map 查找元素和list查找元素速度对比

时间:2024-10-11 09:12:23浏览次数:5  
标签:std map 元素 list 查找 include

在C++中,std::map和std::list是两种不同的容器类型,前者是基于红黑树实现的关联容器,后者是双向链表。

如果你想比较这两种容器在查找元素上的速度,通常std::map会比std::list快得多。因为std::map的查找操作是平均常数时间复杂度,即O(log n),而std::list的查找操作是线性时间复杂度,即O(n)。

以下是使用std::map和std::list查找元素的简单示例:

#include <iostream>
#include <map>
#include <list>
#include <string>
#include <chrono>
 
int main() {
    std::map<int, std::string> myMap;
    std::list<std::pair<int, std::string>> myList;
 
    // 填充数据
    for (int i = 0; i < 10000; ++i) {
        myMap[i] = "value" + std::to_string(i);
        myList.push_back(std::make_pair(i, "value" + std::to_string(i)));
    }
 
    // 使用map查找元素
    int keyToFind = 5000;
    auto start = std::chrono::high_resolution_clock::now();
    auto itMap = myMap.find(keyToFind);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff = end - start;
    std::cout << "Find in map: " << diff.count() << " seconds\n";
 
    // 使用list查找元素
    start = std::chrono::high_resolution_clock::now();
    auto itList = std::find_if(myList.begin(), myList.end(), [&](const std::pair<int, std::string>& p) {
        return p.first == keyToFind;
    });
    end = std::chrono::high_resolution_clock::now();
    diff = end - start;
    std::cout << "Find in list: " << diff.count() << " seconds\n";
 
    return 0;
}

在上面的代码中,我们分别在std::map和std::list中查找了一个元素,并记录了查找所需的时间。你可以运行这个程序,并比较两种情况下所需的时间来看出性能上的差异。

请注意,实际情况中,std::list的查找可能会稍慢一些,因为它还需要处理指针操作。而std::map的查找速度快的原因是红黑树的特性,它能保持数据的有序性,并且能进行高效的二分查找。

标签:std,map,元素,list,查找,include
From: https://www.cnblogs.com/yzxxty/p/18457696

相关文章

  • Result Maps collection already contains value for xxx.xxx.dao.BaseResultMap错误
    重复引入jar包问题解决方法,在pom文件中排除这个jar包原:<dependency><groupId>com.hedu</groupId><artifactId>sweet-template-webapp</artifactId><version>1.0</version></dependency>排除后:&......
  • WPF Image display webp via BitMapImgae BeginInit UriSource EndInit in MVVM
    privatevoidGenenerateBitMapImageViaUrl(stringurl){BitmapImagebmi=newBitmapImage();bmi.BeginInit();bmi.UriSource=newUri(url,UriKind.RelativeOrAbsolute);bmi.EndInit();if(bmi.CanFreeze){bmi.Freeze();}......
  • 代码随想录算法训练营day11|150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K
    学习资料:https://programmercarl.com/0150.逆波兰表达式求值.html#算法公开课栈、队列、堆学习记录:150.逆波兰表达式求值(中序表达式转换为后序表达式,用栈实现;遇到符号就从栈中取前两个元素进行运算,再放回去)点击查看代码fromoperatorimportadd,sub,muldefdiv(x,y):......
  • sqlmap
    一、介绍1.简介SQLMAP是一种开源渗透测试工具,可自动执行SQL注入缺陷的检测和注入过程,并接管数据库服务器。它有强大的检测引擎,针对不同类型的数据库提供多样的渗透测试功能选项,实现数据库识别、数据获取、访问DBMS\操作系统甚至通过带外数据连接的方式执行操作系统的命令。......
  • js-存在重复元素
    219.存在重复元素II给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i]==nums[j] 且 abs(i-j)<=k 。如果存在,返回 true ;否则,返回 false 。代码:第一次尝试:/** *@param{number[]}nums *@param......
  • 三个元素
    题目给定一个包含n个整数的列表 nums,请判断 nums 中是否存在三个元素a,b,c,使得 a+b+c=0?请你找出所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。例如:给定一个列表:[-1,0,1,2,-1,-4]返回结果:[(-1,-1,2),(-1,0,1)]给定一个列表:[1,2,......
  • 深度理解二分查找思想~
    二分思想的基本思想:是将有序数组分成两半,通过比较数组中间元素与目标值大小,来决定下一步搜索的区间是左半部分还是右半部分,然后递归再选定的区间内继续查找。(部分有序的数组也可使用这一思想)二分查找基础代码根据划分区间方法的不同,主要分为三种类型(并在代码后方附有......
  • arm imx6ull docker启动失败问题查找与解决 内核配置相关
    1、增加POSIXMessageqeue:couldnotgetinitialnamespace:nosuchfileordirectory CONFIG_POSIX_MQUEUE=y2、增加namespacefailedtosettoinitialnamespaceCONFIG_NAMESPACES=y3、创建网络失败,veth配置:dockercreateendpointquirky_shternonnetworkbridge......
  • Semaphore源码简单解读
    Semaphore源码解读注意,阅读本文需要了解AQS,AQS采用了模板设计模式。后续本人会完善这篇文章Semaphore的方法acquire()阻塞获得一个许可,会阻塞,直到得到一个可用许可或被中断重载版本acquire(n):尝试获取n个许可acquireUninterruptibly()类acquire,但不可中断tryAcquire()......
  • String类型对象每个元素转换为List<Character>或List<String>
    Stringstr="abc";第一眼想到是通过String#toCharArray()转换为char[],然后再转换为List,尝试用Arrays.asList(T...a):char[]chars=str.toCharArray();List<char[]>list=Arrays.asList(chars);System.out.println(list);发现转换结果不符合预期,因为是原始类型数组,被......