当前位置: 首页 > news >正文

C++技巧:map和vector

一,map是有序的,unordered_map是无序的

在C++中,std::mapstd::unordered_map 是两种不同的容器,它们都用于存储键值对,但是它们的底层实现和性能特性有所不同。以下是它们的详细介绍:

std::map

std::map 是一个有序的关联容器,它基于红黑树实现。这意味着元素会根据键自动排序,通常是按照键的升序排列。

特点

  1. 有序性:元素按照键的顺序自动排序。
  2. 唯一性:每个键都是唯一的,不允许重复的键。
  3. 性能:查找、插入和删除操作的时间复杂度为 O(log n),其中 n 是容器中元素的数量。
  4. 迭代器:支持双向迭代器,可以向前和向后遍历。
  5. 键值对:存储的数据是键值对 <key, value> 的形式。

使用场景

  • 当需要有序遍历元素时。
  • 当需要根据键的范围进行查询时。

std::unordered_map

std::unordered_map 是一个无序的关联容器,它基于哈希表实现。这意味着元素的存储是无序的,元素的顺序取决于哈希函数和冲突解决策略。

特点

  1. 无序性:元素的存储是无序的。
  2. 唯一性:每个键都是唯一的,不允许重复的键。
  3. 性能:在理想情况下,查找、插入和删除操作的平均时间复杂度为 O(1)。在最坏情况下,这些操作的时间复杂度为 O(n),但这种情况很少发生。
  4. 迭代器:支持向前迭代器,只能向前遍历。
  5. 键值对:存储的数据是键值对 <key, value> 的形式。

使用场景

  • 当不需要有序遍历时。
  • 当对查找性能有较高要求时。
  • 当元素的哈希函数分布均匀,可以减少哈希冲突时。

性能比较

  • 查找性能std::unordered_map 通常比 std::map 快,因为它的平均时间复杂度为 O(1)。
  • 内存使用std::unordered_map 通常比 std::map 使用更多的内存,因为它需要存储哈希表和可能的链表或红黑树(用于解决哈希冲突)。
  • 插入性能:对于 std::unordered_map,插入操作可能需要重新哈希和内存分配,这可能导致性能波动。而 std::map 的插入操作通常更稳定。

总结

选择 std::map 还是 std::unordered_map 取决于具体的应用场景。如果需要有序遍历或者对元素进行范围查询,std::map 是更好的选择。如果需要快速的查找性能,并且不关心元素的顺序,std::unordered_map 则是更合适的选择。

题目 731. 我的日程安排表 II

正确代码:

class MyCalendarTwo {map<int, int> count;
public:MyCalendarTwo() {}bool book(int startTime, int endTime) {count[startTime] ++;count[endTime] --;int cnt = 0;for(auto it: count){cnt += it.second;if(cnt > 2){count[startTime] --;count[endTime] ++;return false;}}return true;}};

错误代码:

class MyCalendarTwo {unordered_map<int, int> count;
public:MyCalendarTwo() {}bool book(int startTime, int endTime) {count[startTime] ++;count[endTime] --;int cnt = 0;for(auto it: count){cnt += it.second;if(cnt > 2){count[startTime] --;count[endTime] ++;return false;}}return true;}};

不要用for(auto it : vector)

这会因为拷贝而影响效率

根据搜索结果,我们可以得出以下结论关于遍历 vector<vector<int>>& trust 的效率:

  1. 下标遍历:在某些情况下,下标遍历被认为是最快的方法,因为它直接通过索引访问元素,避免了迭代器的额外开销。在一些测试中,下标遍历比迭代器遍历快了约10倍。

  2. 迭代器遍历:使用迭代器遍历 vector 也是常见的方法,但在某些测试中,迭代器遍历比下标遍历慢,尤其是在大量数据的情况下。

  3. 范围基的for循环(C++11及以上):这种遍历方式在某些情况下被认为效率最高,尤其是在优化编译后的环境中。它提供了简洁的语法,并且在某些情况下,性能与下标遍历相当,甚至在某些情况下更快。

  4. std::for_each 算法:虽然 std::for_each 提供了一种通用的遍历方式,但在性能测试中,它通常不如下标遍历和迭代器遍历快。

  5. auto迭代器:在某些测试中,auto迭代器的性能略低于迭代器,但高于 std::for_each

综上所述,下标遍历范围基的for循环在大多数情况下提供了较高的效率。然而,具体哪种方法效率最高可能还取决于具体的编译器优化和数据集的大小。在实际应用中,建议根据具体情况进行性能测试,以确定最适合你需求的遍历方法。

使用C++11的嵌套范围基的for循环

for (auto& row : trust) {for (int val : row) {cout << val << " ";}cout << endl;
}

相关文章:

C++技巧:map和vector

一&#xff0c;map是有序的&#xff0c;unordered_map是无序的 在C中&#xff0c;std::map 和 std::unordered_map 是两种不同的容器&#xff0c;它们都用于存储键值对&#xff0c;但是它们的底层实现和性能特性有所不同。以下是它们的详细介绍&#xff1a; std::map std::m…...

中建海龙:科技助力福城南产业片区绿色建筑发展

在快速发展的城市化进程中&#xff0c;绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;凭借其卓越的科技实力和创新举措&#xff0c;在推动绿色建筑发展方面做出了…...

模块化通讯管理机在物联网系统中的应用

安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进&#xff0c;电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例&#xff0c;探讨其在电力物联网中的应用&#xff0c;包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…...

建立一个Macos载入image的实例含界面

前言 为了方便ios程序的开发&#xff0c;有时候需要先用的Macos平台进行一些功能性的程序开发。 作为对比和参考。 1、创建一个MacOS的App 2、主界面控件的增加 添加的控件方法与ios相同&#xff0c;也是再用commandshiftL&#xff08;CtrlShiftL&#xff09;,就会弹出控件…...

Redis List列表

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis List列表 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 概述 常用命令 LPUSH …...

继承与多态 - 继承机制、虚函数、纯虚函数

引言 C 是一种支持面向对象编程&#xff08;OOP&#xff09;的编程语言&#xff0c;继承和多态是 OOP 的两个核心概念。通过继承&#xff0c;我们可以创建新的类&#xff0c;这些新类可以重用现有类的代码&#xff0c;并且可以根据需要进行扩展或修改。多态则允许我们编写更加…...

【QT】C++线程安全的单例模板

模板代码 #pragma once #include <mutex> #include <atomic>// CRTP基类模板 Curiously Recurring Template Parttern—奇异递归模板模式。 template <typename T> class SingletonCRTP { public:// 禁止拷贝构造和赋值操作SingletonCRTP(const SingletonCR…...

node.js内置模块之---EventEmitter 类

EventEmitter 类什么作用 EventEmitter 类的主要方法 EventEmitter 类什么作用 在 Node.js 中&#xff0c;EventEmitter 是一个非常核心的类&#xff0c;它提供了一种事件驱动的机制。几乎所有的 Node.js 核心模块&#xff08;如 fs, http, net 等&#xff09;都采用了事件驱…...

SWM221系列芯片之电机应用及控制

经过对SWM221系列的强大性能及外设资源&#xff0c;TFTLCD彩屏显示及控制进行了整体介绍后&#xff0c;新迎来我们的电控篇---SWM221系列芯片之电机应用及控制。在微控制器市场面临性能、集成度与成本挑战的当下&#xff0c;SWM221系列芯片以其卓越性能与创新设计&#xff0c;受…...

单片机-静动态数码管实验

P0控制数码管 &#xff0c;P0低电平 P1,P2,P3高电平 1、静态数码管 需求&#xff1a;数码管显示0&#xff0c;即让p0端口输出数字0的段码0x3f(共阴) #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //数码管显示数字的数组 共阴极 …...

Fabric环境部署

官方下载文档&#xff1a;A Blockchain Platform for the Enterprise — Hyperledger Fabric Docs main documentation 1.1 创建工作目录 将Fabric代码按照GO语言的推荐方式进行存放&#xff0c;创建目录结构并切换到该目录下。具体命令如下&#xff1a; mkdir -p ~/go/src/g…...

VisualRules规则引擎语法介绍

VisualRules规则引擎是一款用于处理复杂业务规则的引擎&#xff0c;广泛应用于金融、保险、医疗等领域。它通过将业务逻辑从代码中分离出来&#xff0c;以可配置的方式管理和执行规则。以下是VisualRules规则引擎的基本语法和使用方法&#xff1a; 1. 规则定义 规则通常由 条件…...

enzymejest TDD与BDD开发实战

一、前端自动化测试需要测什么 1. 函数的执行逻辑&#xff0c;对于给定的输入&#xff0c;输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言&#xff0c;测试粒度较细&#xff0c;需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…...

Statistic for ML

statistical concept 統計學概念 免費完整內容 PMF and CDF PMF定義的值是P(Xx)&#xff0c;而CDF定義的值是P(X < x)&#xff0c;x為所有的實數線上的點。 probability mass function (PMF) 概率質量函數 p X ( x ) P ( X x ) pX(x)P(Xx) pX(x)P(Xx) 是離散隨機變數…...

Django 中数据库迁移命令

在 Django 中&#xff0c;python manage.py makemigrations、python manage.py sqlmigrate polls 0003 和 python manage.py migrate 是与数据库迁移相关的重要命令。它们的作用和对应内容如下&#xff1a; 1. python manage.py makemigrations 功能: 此命令会根据你的模型文…...

【机器学习】 卷积神经网络 (CNN)

文章目录 1. 为什么需要 CNN2. CNN 的架构3. 卷积层4. 池化层5. CNN 的应用 1. 为什么需要 CNN 前提&#xff1a;利用前置知识&#xff0c;去掉全连接神经网络中的部分参数&#xff0c;提升学习效率。本质&#xff1a;在 DNN 之前加上 CNN&#xff0c;先去除不必要的参数&…...

Linux中操作中的无痕命令history技巧

当我们需要查看Linux下的操作记录时&#xff0c;就可以用history命令来查看历史记录 1、关闭history记录功能&#xff0c;如果不想让别人看到自己在Linux上的操作命令&#xff0c;可以用这个命令 set o history 2、打开history记录功能 set -o history3、清空记录 histor…...

在CE自动汇编里调用lua函数

CE自动汇编模板里有一个是调用lua函数&#xff0c;但是关于如何使用的资料很少&#xff0c;结果问AI也是各种错误回答&#xff0c;还各种误导... 下面是32位游戏的例子&#xff1a; loadlibrary(luaclient-i386.dll) luacall(openLuaServer(CELUASERVER))CELUA_ServerName: d…...

如何在没有 iCloud 的情况下将联系人从 iPhone 传输到 iPhone

概括 近期iOS 13.5的更新以及苹果公司发布的iPhone SE在众多iOS用户中引起了不小的轰动。此外&#xff0c;不少变化&#xff0c;如暴露通知 API、Face ID 增强功能以​​及其他在 COVID-19 期间与公共卫生相关的新功能&#xff0c;吸引了 iPhone 用户尝试新 iPhone 并更新到最…...

欧科云链研究院:ChatGPT 眼中的 Web3

编辑&#xff5c;OKG Research 转眼间&#xff0c;2024年已经进入尾声&#xff0c;Web3 行业经历了热闹非凡的一年。今年注定也是属于AI的重要一年&#xff0c;OKG Research 决定拉上 ChatGPT 这位“最懂归纳的AI拍档”&#xff0c;尝试把一整年的研究内容浓缩成精华。我们一共…...

行为模式2.命令模式------灯的开关

行为型模式 模板方法模式&#xff08;Template Method Pattern&#xff09;命令模式&#xff08;Command Pattern&#xff09;迭代器模式&#xff08;Iterator Pattern&#xff09;观察者模式&#xff08;Observer Pattern&#xff09;中介者模式&#xff08;Mediator Pattern…...

Kerberos用户认证-数据安全-简单了解-230403

hadoop安全模式官方文档&#xff1a;https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。 概念&#…...

【Multisim用74ls92和90做六十进制】2022-6-12

缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考...

滴滴工作流引擎Turbo与logicFlow研究

目录 logicFlow turbo 工作流引擎很多,也都提供了前端UI库,但是太过于冗杂了,元数据表都几十个,logincFlow和Turbo的组合提供了轻量化方式,turbo后端代码只有5个元数据表,logicFlow也提供了bpm的相关扩展功能,但缺点是turbo社区不活跃,logicFlow个人认为跟echarts这种…...

AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual

AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual...

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…...

Nginx rewrite 执行顺序(草稿,下次继续编辑)

个人结论: 1.server层ngx_http_rewrite_module模块相关指令按照配置顺序依次执行&#xff1b; 2.server层执行完break指令后&#xff0c;该层级所有跟ngx_http_rewrite_module模块相关的指令都不再被执行&#xff0c;但是不影响其他模块(例如:https://zhuanlan.zhihu.com/p/357…...

01.03周五F34-Day44打卡

文章目录 1. 这家医院的大夫和护士对病人都很耐心。2. 她正跟一位戴金边眼镜的男士说话。3. 那个人是个圆脸。4. 那个就是传说中的鬼屋。5. 他是个很好共事的人。6. 我需要一杯提神的咖啡。7. 把那个卷尺递给我一下。 ( “卷尺” 很复杂吗?)8. 他收到了她将乘飞机来的消息。9.…...

数字货币支付系统开发搭建:构建未来的区块链支付生态

随着数字货币的迅猛发展&#xff0c;越来越多的企业和机构开始关注如何搭建一个高效、安全、可扩展的数字货币支付系统。区块链技术因其去中心化、安全性高、透明性强等优势&#xff0c;已成为开发数字货币支付系统的首选技术。本文将深入探讨数字货币支付系统的开发和搭建过程…...

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…...