C++技巧:map和vector
一,map是有序的,unordered_map是无序的
在C++中,std::map 和 std::unordered_map 是两种不同的容器,它们都用于存储键值对,但是它们的底层实现和性能特性有所不同。以下是它们的详细介绍:
std::map
std::map 是一个有序的关联容器,它基于红黑树实现。这意味着元素会根据键自动排序,通常是按照键的升序排列。
特点:
- 有序性:元素按照键的顺序自动排序。
- 唯一性:每个键都是唯一的,不允许重复的键。
- 性能:查找、插入和删除操作的时间复杂度为 O(log n),其中 n 是容器中元素的数量。
- 迭代器:支持双向迭代器,可以向前和向后遍历。
- 键值对:存储的数据是键值对
<key, value>的形式。
使用场景:
- 当需要有序遍历元素时。
- 当需要根据键的范围进行查询时。
std::unordered_map
std::unordered_map 是一个无序的关联容器,它基于哈希表实现。这意味着元素的存储是无序的,元素的顺序取决于哈希函数和冲突解决策略。
特点:
- 无序性:元素的存储是无序的。
- 唯一性:每个键都是唯一的,不允许重复的键。
- 性能:在理想情况下,查找、插入和删除操作的平均时间复杂度为 O(1)。在最坏情况下,这些操作的时间复杂度为 O(n),但这种情况很少发生。
- 迭代器:支持向前迭代器,只能向前遍历。
- 键值对:存储的数据是键值对
<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 的效率:
-
下标遍历:在某些情况下,下标遍历被认为是最快的方法,因为它直接通过索引访问元素,避免了迭代器的额外开销。在一些测试中,下标遍历比迭代器遍历快了约10倍。
-
迭代器遍历:使用迭代器遍历
vector也是常见的方法,但在某些测试中,迭代器遍历比下标遍历慢,尤其是在大量数据的情况下。 -
范围基的for循环(C++11及以上):这种遍历方式在某些情况下被认为效率最高,尤其是在优化编译后的环境中。它提供了简洁的语法,并且在某些情况下,性能与下标遍历相当,甚至在某些情况下更快。
-
std::for_each算法:虽然std::for_each提供了一种通用的遍历方式,但在性能测试中,它通常不如下标遍历和迭代器遍历快。 -
auto迭代器:在某些测试中,auto迭代器的性能略低于迭代器,但高于
std::for_each。
综上所述,下标遍历和范围基的for循环在大多数情况下提供了较高的效率。然而,具体哪种方法效率最高可能还取决于具体的编译器优化和数据集的大小。在实际应用中,建议根据具体情况进行性能测试,以确定最适合你需求的遍历方法。
使用C++11的嵌套范围基的for循环
for (auto& row : trust) {for (int val : row) {cout << val << " ";}cout << endl;
}
相关文章:
C++技巧:map和vector
一,map是有序的,unordered_map是无序的 在C中,std::map 和 std::unordered_map 是两种不同的容器,它们都用于存储键值对,但是它们的底层实现和性能特性有所不同。以下是它们的详细介绍: std::map std::m…...
中建海龙:科技助力福城南产业片区绿色建筑发展
在快速发展的城市化进程中,绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业,中建海龙科技有限公司(简称“中建海龙”)凭借其卓越的科技实力和创新举措,在推动绿色建筑发展方面做出了…...
模块化通讯管理机在物联网系统中的应用
安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进,电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例,探讨其在电力物联网中的应用,包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…...
建立一个Macos载入image的实例含界面
前言 为了方便ios程序的开发,有时候需要先用的Macos平台进行一些功能性的程序开发。 作为对比和参考。 1、创建一个MacOS的App 2、主界面控件的增加 添加的控件方法与ios相同,也是再用commandshiftL(CtrlShiftL),就会弹出控件…...
Redis List列表
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Redis List列表 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 概述 常用命令 LPUSH …...
继承与多态 - 继承机制、虚函数、纯虚函数
引言 C 是一种支持面向对象编程(OOP)的编程语言,继承和多态是 OOP 的两个核心概念。通过继承,我们可以创建新的类,这些新类可以重用现有类的代码,并且可以根据需要进行扩展或修改。多态则允许我们编写更加…...
【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 中,EventEmitter 是一个非常核心的类,它提供了一种事件驱动的机制。几乎所有的 Node.js 核心模块(如 fs, http, net 等)都采用了事件驱…...
SWM221系列芯片之电机应用及控制
经过对SWM221系列的强大性能及外设资源,TFTLCD彩屏显示及控制进行了整体介绍后,新迎来我们的电控篇---SWM221系列芯片之电机应用及控制。在微控制器市场面临性能、集成度与成本挑战的当下,SWM221系列芯片以其卓越性能与创新设计,受…...
单片机-静动态数码管实验
P0控制数码管 ,P0低电平 P1,P2,P3高电平 1、静态数码管 需求:数码管显示0,即让p0端口输出数字0的段码0x3f(共阴) #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //数码管显示数字的数组 共阴极 …...
Fabric环境部署
官方下载文档:A Blockchain Platform for the Enterprise — Hyperledger Fabric Docs main documentation 1.1 创建工作目录 将Fabric代码按照GO语言的推荐方式进行存放,创建目录结构并切换到该目录下。具体命令如下: mkdir -p ~/go/src/g…...
VisualRules规则引擎语法介绍
VisualRules规则引擎是一款用于处理复杂业务规则的引擎,广泛应用于金融、保险、医疗等领域。它通过将业务逻辑从代码中分离出来,以可配置的方式管理和执行规则。以下是VisualRules规则引擎的基本语法和使用方法: 1. 规则定义 规则通常由 条件…...
enzymejest TDD与BDD开发实战
一、前端自动化测试需要测什么 1. 函数的执行逻辑,对于给定的输入,输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言,测试粒度较细,需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…...
Statistic for ML
statistical concept 統計學概念 免費完整內容 PMF and CDF PMF定義的值是P(Xx),而CDF定義的值是P(X < x),x為所有的實數線上的點。 probability mass function (PMF) 概率質量函數 p X ( x ) P ( X x ) pX(x)P(Xx) pX(x)P(Xx) 是離散隨機變數…...
Django 中数据库迁移命令
在 Django 中,python manage.py makemigrations、python manage.py sqlmigrate polls 0003 和 python manage.py migrate 是与数据库迁移相关的重要命令。它们的作用和对应内容如下: 1. python manage.py makemigrations 功能: 此命令会根据你的模型文…...
【机器学习】 卷积神经网络 (CNN)
文章目录 1. 为什么需要 CNN2. CNN 的架构3. 卷积层4. 池化层5. CNN 的应用 1. 为什么需要 CNN 前提:利用前置知识,去掉全连接神经网络中的部分参数,提升学习效率。本质:在 DNN 之前加上 CNN,先去除不必要的参数&…...
Linux中操作中的无痕命令history技巧
当我们需要查看Linux下的操作记录时,就可以用history命令来查看历史记录 1、关闭history记录功能,如果不想让别人看到自己在Linux上的操作命令,可以用这个命令 set o history 2、打开history记录功能 set -o history3、清空记录 histor…...
在CE自动汇编里调用lua函数
CE自动汇编模板里有一个是调用lua函数,但是关于如何使用的资料很少,结果问AI也是各种错误回答,还各种误导... 下面是32位游戏的例子: loadlibrary(luaclient-i386.dll) luacall(openLuaServer(CELUASERVER))CELUA_ServerName: d…...
如何在没有 iCloud 的情况下将联系人从 iPhone 传输到 iPhone
概括 近期iOS 13.5的更新以及苹果公司发布的iPhone SE在众多iOS用户中引起了不小的轰动。此外,不少变化,如暴露通知 API、Face ID 增强功能以及其他在 COVID-19 期间与公共卫生相关的新功能,吸引了 iPhone 用户尝试新 iPhone 并更新到最…...
欧科云链研究院:ChatGPT 眼中的 Web3
编辑|OKG Research 转眼间,2024年已经进入尾声,Web3 行业经历了热闹非凡的一年。今年注定也是属于AI的重要一年,OKG Research 决定拉上 ChatGPT 这位“最懂归纳的AI拍档”,尝试把一整年的研究内容浓缩成精华。我们一共…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
