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

三种容器 std::vector、std::map、std::unordered_set 的对比分析

目录

1.添加元素

1.1 std::vector

1.2 std::map

1.3 std::unordered_set

2. 查找元素

2.1 std::vector

2.2 std::map

2.3 std::unordered_set

3. 遍历容器

3.1 std::vector

使用范围基for循环(range-based for loop)

使用迭代器:

3.2 std::map

3.3 std::unordered_set

4.删除元素

4.1 std::vector

4.2 std::map

4.3 std::unordered_set

5. 综合分析

6.优缺点对比

示例代码片段

7. 总结


在C++编程中,选择合适的容器对于代码的性能和功能至关重要。本文将对比分析 std::vectorstd::map 和 std::unordered_set 这三种常用容器的使用方式、特点,特别是在添加元素、查找元素和遍历容器等方面的表现。

1.添加元素

1.1 std::vector

std::vector 是一个动态数组,支持快速随机访问,但在插入或删除元素时,可能需要移动大量数据。

std::vector<std::pair<int, int>> problems;  
problems.emplace_back(std::pair<int, int>(randomValue1, randomValue2));

1.2 std::map

std::map 是一种平衡二叉搜索树(红黑树)实现的有序关联容器,插入操作的时间复杂度为 O(log n),且自动按键排序。

std::map<std::string, int> incorrectProblems;  
incorrectProblems.insert(std::pair<std::string, int>(exp, result.second));

1.3 std::unordered_set

std::unordered_set 是基于哈希表的无序关联容器,插入操作的平均时间复杂度为 O(1),但在最坏情况下可能退化为 O(n)。

std::unordered_set<std::string> uniqueProblems;  
uniqueProblems.insert(exp);

2. 查找元素

2.1 std::vector

在 std::vector 中查找元素通常需要线性搜索,时间复杂度为 O(n),但如果数据有序,可以使用二分查找优化。

auto it = std::find_if(problems.begin(), problems.end(),   [=](const auto& problem) {   return problem.first == value1 && problem.second == value2;   });

2.2 std::map

std::map 使用平衡二叉树结构,查找操作的时间复杂度为 O(log n),且支持按键直接访问。

auto it = incorrectProblems.find(exp);  
if (it != incorrectProblems.end()) {  // 元素存在  
}

2.3 std::unordered_set

std::unordered_set 基于哈希表实现,查找操作的平均时间复杂度为 O(1)。

if (uniqueProblems.find(exp) != uniqueProblems.end()) {  // 元素存在  
}

相关文章:

三种容器 std::vector、std::map、std::unordered_set 的对比分析

目录 1.添加元素 1.1 std::vector 1.2 std::map 1.3 std::unordered_set 2. 查找元素 2.1 std::vector 2.2 std::map 2.3 std::unordered_set 3. 遍历容器 3.1 std::vector 使用范围基for循环(range-based for loop) 使用迭代器: 3.2 std::map 3.3 std::unord…...

Nuxt3 SSR 服务端渲染部署 PM2 全流程(Nest.js 同理)

项目打包 我们以 Nuxt3 项目为例子&#xff1a; 项目打包 执行 npm run build &#xff0c; 生成的 .output 文件夹就是部署产物&#xff08;目前不支持中文路径&#xff09;执行 npm run preview 可以本地预览效果 方式一&#xff1a;使用 Node 部署 需要服务器安装 Nod…...

如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Git模块 📒📝 Git仓库要求🔖 项目目录结构🔖 文件说明📝 编写setup.py📝 配置MANIFEST.in📝 推送代码到Git仓库📝 使用pip安装模块🔖 使用用户名和密码🔖 使用Personal Access Token (PAT)🔖 示例📝 更…...

写 R 包教程

R R 包开发 | 保姆级教程-CSDN博客 https://www.prestevez.com/post/r-package-tutorial/ 1、加载开发所需 R 包 library(usethis) library(devtools) library(roxygen2) 2、在当前工作路径创建 R 包 usethis::create_package("myRpkg") # 在当前路径创建 my…...

【java】数组(超详细总结)

目录 一.一维数组的定义 1.创建数组 2.初始化数组 二.数组的使用 1.访问数组 2.遍历数组 3.修改数据内容 三.有关数组方法的使用 1.toString 2. copyOf 四.查找数组中的元素 1.顺序查找 2.二分查找binarySearch 五.数组排序 1.冒泡排序 2.排序方法sort 六.数组逆置…...

@KafkaListener注解

KafkaListener(topics "${xxxx}", containerFactory "xxx") public void consume(String message) {service.save(xx); }在 Spring Boot 中&#xff0c;使用 KafkaListener 注解消费 Kafka 消息时&#xff0c;如果 service.save(cleanWikiSource) 抛出异…...

2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)

2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025) 2025 International Conference on Advances in Computer Vision Research and Applications 重要信息 2025年3月28-30日 南京 一轮截稿日期&#xff1a;2024年11月30日 EI检索稳定 早投稿&#xff0c;早审稿&a…...

第二代GPT-SoVITS V2:让声音克隆变得简单

随着人工智能技术的飞速发展&#xff0c;AI声音克隆已经成为一种趋势&#xff0c;广泛应用于各个领域。为了满足更多用户的需求&#xff0c;第二代GPT-SoVITS V2应运而生&#xff0c;它由RVC变声器创始人“花儿不哭”与AI音色转换技术Sovits开发者Rcell联合开发&#xff0c;是一…...

基于x86_64汇编语言简单教程6: 变量,常量,与运算

目录 变量 为未初始化的数据分配存储空间 多重初始化 常量 equ指令 &#xff05;assign 指令 &#xff05;define指令 算数指令 inc 自增指令 dec指令 ADD和SUB指令 imul/mul和idiv/div 实践&#xff1a;我们来写一个简单的一位数加法器 NASM逻辑指令 AND 指令 …...

Vue-router 路由守卫执行流程图

vue-router 路由守卫执行的流程图&#xff08;个人理解&#xff09; 图1 - 图2...

ES6 中函数参数的默认值

概述&#xff1a; ES 允许给函数的参数赋初始值&#xff1b; 代码示例及相关说明&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>函数参数默认值</title> </head> <body> <script&g…...

Redis知识应用索引指南

Redis&#xff0c;全称为Remote Dictionary Server&#xff0c;是一个开源的高性能键值对数据库。它以其卓越的性能、丰富的数据结构和灵活的持久化机制&#xff0c;在现代应用中扮演着至关重要的角色 1 什么是redis Redis是一个使用ANSI C语言编写的开源、跨平台的键值存储系…...

ES6扩展运算符

1.介绍&#xff1a; ... 扩展运算符能将数组转换为逗号分隔的参数序列&#xff1b; 扩展运算符&#xff08;spread&#xff09;也是三个点&#xff08;...&#xff09;。它好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的 参数序列&#xff0c;对数组进…...

【树莓派 5B】Python 版本切换

【树莓派 5B】Python 版本切换 前言整体思路具体步骤常见问题Python 无法建立与 Python3 的软连接 前言 本文基于树莓派5B 32-bit 树莓派OS&#xff0c;以 Python-3.11.2 降级到 3.9.2 为例&#xff0c;总结了在树莓派上切换 Python 版本的步骤&#xff0c;帮助大家轻松完成 P…...

windows C++-有效使用PPL(五)

如果可能&#xff0c;避免错误共享 当在不同处理器上运行的多个并发任务写入位于同一高速缓存行上的变量时&#xff0c;会发生错误共享。 当一个任务写入一个变量时&#xff0c;这两个变量的缓存行将会失效。 每当缓存行失效时&#xff0c;每个处理器必须重新加载缓存行。 因此…...

【排序】——1.冒泡排序法(含优化)

冒泡排序 1.原理 左边大于右边交换一趟排下来最大的交换到右边来(接下来所以文章用升序举例) 从左到右&#xff0c;相邻元素进行比较。 每次比较一轮&#xff0c;就会找到序列中最大的一个&#xff08;最小的一个——降序&#xff09;。这个数就会从序列的最右边冒出来。 以…...

在MySQL中创建数据库和表

在MySQL中&#xff0c;创建数据库和表是数据库管理的基础操作。下面我将详细解释如何先创建一个数据库&#xff0c;然后在该数据库中创建一个或多个表。 ### 1. 创建数据库 首先&#xff0c;你需要登录到MySQL服务器。然后&#xff0c;使用CREATE DATABASE语句来创建一个新的…...

Hadoop 安装教程——单节点模式和分布式模式配置

文章目录 一、预备知识1.1 Hadoop 发行版本1.2 部署方式 二、预备条件2.1 环境准备2.2 创建新用户(可选)2.3 配置 SSH 无密码登录2.4 下载 Hadoop2.5 编辑 hadoop-env.sh 脚本2.6 编辑 dfs 和 yarn 脚本 三、单节点模式部署3.1 官方使用案例3.2 查看运行结果 四、伪分布模式部署…...

给c++小白的教程10:一维数组

好久不见&#xff01;我又来更教程了。 升到初二&#xff0c;由于学业原因&#xff0c;更新速度减慢了&#xff0c;十分抱歉&#xff01; 以后将恢复到一周一次的频率 作者只是个普通学生&#xff0c;做的教程多有不足&#xff0c;希望大家批评指正&#xff01; 赫炎今天在一…...

【排序】3.希尔排序法

希尔排序&#xff08;直接插入排序的优化&#xff09; 1.分组思想 上图中gap为5&#xff0c;说明要分成5组。 这5组分别用了五种颜色的线条连接起来了。 第1组&#xff1a;9、4 第2组&#xff1a;1、8 第3组&#xff1a;2、6 第4组&#xff1a;5、3 第5组&#xff1a;7、5 2.缩…...

UE5对象池系统深度解析:如何基于Subsystem框架设计可扩展的Gameplay工具

UE5对象池系统深度解析&#xff1a;如何基于Subsystem框架设计可扩展的Gameplay工具 在快节奏的现代游戏开发中&#xff0c;性能优化始终是开发者面临的核心挑战之一。想象一下这样的场景&#xff1a;当玩家在射击游戏中连续发射数百发子弹&#xff0c;或者在开放世界游戏中频繁…...

AI编程助手功能解锁:开源破解方案与开发工具权限绕过技术探索

AI编程助手功能解锁&#xff1a;开源破解方案与开发工具权限绕过技术探索 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached y…...

告别复杂配置!Fish Speech 1.5 开箱即用,3步搭建你的专属语音合成工具

告别复杂配置&#xff01;Fish Speech 1.5 开箱即用&#xff0c;3步搭建你的专属语音合成工具 1. 为什么选择Fish Speech 1.5&#xff1f; 语音合成技术正在改变我们与数字世界的交互方式&#xff0c;但传统TTS系统往往需要复杂的音素标注和专业配置。Fish Speech 1.5通过创新…...

Realistic Vision V5.1 虚拟摄影棚结合传统软件:生成素材导入PS进行后期合成

Realistic Vision V5.1 虚拟摄影棚结合传统软件&#xff1a;生成素材导入PS进行后期合成 你有没有遇到过这样的场景&#xff1a;脑子里有一个绝佳的创意画面&#xff0c;但要么找不到合适的模特和场景&#xff0c;要么拍摄成本高得吓人&#xff0c;要么就是后期修图修到天昏地…...

WPF按钮样式进阶:从字体图标到动态交互效果全解析

1. 字体图标在WPF按钮中的应用 在WPF开发中&#xff0c;使用字体图标替代传统图片资源已经成为提升界面美观度和性能的最佳实践。阿里巴巴矢量图标库&#xff08;iconfont&#xff09;是目前最受欢迎的免费图标资源平台之一&#xff0c;它提供了海量的矢量图标资源&#xff0c;…...

用快马快速构建排序算法可视化原型,直观比较性能差异

最近在复习算法基础时&#xff0c;发现单纯看代码很难直观理解不同排序算法的差异。于是尝试用InsCode(快马)平台快速搭建了一个排序算法可视化工具&#xff0c;整个过程比想象中简单很多&#xff0c;分享下具体实现思路。 需求分析 首先明确需要展示五种经典排序算法&#xff…...

跨平台办公利器:OpenOffice在Linux与Windows系统的高效部署指南

1. 为什么选择OpenOffice作为跨平台办公方案 作为一个在多个操作系统环境下折腾过办公软件的老手&#xff0c;我强烈推荐OpenOffice作为跨平台办公的首选工具。它最大的优势就是完全免费开源&#xff0c;而且对Linux和Windows系统都有完美支持。我最早接触OpenOffice是在2013年…...

线控转向系统 Carsim和Simulink联合仿真模型。 基于横摆角速度增益不变的变传动比模块。 图中分别为角阶跃工况 和 双移线工况 汽车对应的响应曲线,并且与Carsim自带的机械转向对比图。

线控转向系统 Carsim和Simulink联合仿真模型。 基于横摆角速度增益不变的变传动比模块。 图中分别为角阶跃工况 和 双移线工况 汽车对应的响应曲线&#xff0c;并且与Carsim自带的机械转向对比图。这是一个非常专业的汽车动力学控制仿真需求。要实现线控转向&#xff08;SBW&am…...

PID调参不再玄学:用自平衡小车实战,带你搞懂比例、积分、微分到底在干嘛

PID调参实战&#xff1a;用自平衡小车拆解比例、积分、微分的控制艺术 平衡车在桌面上稳稳立住的那一刻&#xff0c;仿佛打破了物理定律——这个看似简单的动作背后&#xff0c;是控制理论中最经典的PID算法在发挥作用。但翻开任何一本自动控制教材&#xff0c;满页的微分方程…...

MATLAB科研绘图:如何用title/legend/grid on让你的论文图表通过审稿人‘火眼金睛’?

MATLAB科研绘图&#xff1a;学术图表标注的审稿人级优化指南 科研图表是论文的"门面"&#xff0c;审稿人往往在30秒内就能通过图表质量判断研究的严谨性。我曾参与多个顶级期刊的图表评审工作&#xff0c;发现90%的退稿图表问题都出在标注细节上——不是数据不好&…...