c++ set和unordered_set区别

一.set介绍

C++ 中的 set 容器是一种关联容器,用于存储唯一的元素,并能够根据特定的顺序对元素进行排列。在这里,我们将对 set 容器进行详细的分析。

  • 概述

set 容器是 C++标准库中的一个部分,位于 头文件中。它是一个关联容器,意味着每个元素都是唯一的,并且可以根据特定的顺序对元素进行排列。

  • 特点
  1. 唯一性:set 容器中的元素是唯一的,不允许重复。
  2. 有序性:set 容器中的元素是按照特定的顺序排列的,通常是升序或降序。
  3. 关联性:set 容器是关联容器,意味着每个元素都是唯一的,并且可以根据特定的顺序对元素进行排列。
  • 实现

set 容器的实现是基于红黑树(Red-Black Tree)数据结构的。红黑树是一种自平衡的二叉查找树,它能够维护树的平衡,使得查找、插入和删除操作的时间复杂度保持在 O(log n) 级别。

  • 常用操作
  1. 插入:使用 insert 方法将元素插入到 set 容器中。如果元素已经存在,将不会被插入。
set<int> mySet;
mySet.insert(10);
mySet.insert(20);
  1. 遍历:使用迭代器遍历 set 容器中的元素。
for (auto it = mySet.begin(); it != mySet.end(); ++it) {cout << *it << " ";
}
  1. 查找:使用 find 方法在 set 容器中查找特定元素。如果找到,将返回该元素的迭代器;否则,将返回结束迭代器。
auto it = mySet.find(20);
if (it != mySet.end()) {cout << "Element found in set";
}
  1. 删除:使用 erase 方法删除 set 容器中的元素。
mySet.erase(10);
  • 优点
  1. 快速查找:set 容器的查找操作非常快,时间复杂度为 O(log n)。
  2. 自动排序:set 容器自动维护元素的顺序,无需手动排序。
  3. 唯一性:set 容器保证元素的唯一性,无需手动检查重复元素。
  • 缺点
  1. 插入慢:set 容器的插入操作相对较慢,时间复杂度为 O(log n)。
  2. 空间占用:set 容器的空间占用相对较高,因为红黑树需要维护树的平衡。
  • 应用场景
  1. 集合操作:set 容器非常适合集合操作,如 union、intersection、difference 等。
  2. 自动排序:set 容器自动维护元素的顺序,无需手动排序。
  3. 快速查找:set 容器的查找操作非常快,时间复杂度为 O(log n)。

二.unordered_set介绍

unordered_set 是 C++11 中引入的一个关联容器,它用于存储唯一的元素,但是不维护元素的顺序。相比于 set 容器,unordered_set 容器提供了更快的查找、插入和删除操作,但牺牲了元素的顺序。

  • 概述

unordered_set 容器是 C++11 中引入的一个关联容器,位于 <unordered_set> 头文件中。它是一个无序容器,意味着元素的顺序是无关紧要的。

  • 特点
  1. 唯一性:unordered_set 容器中的元素是唯一的,不允许重复。
  2. 无序性:unordered_set 容器中的元素是无序的,元素的顺序无关紧要。
  3. 快速查找:unordered_set 容器提供了非常快的查找操作,时间复杂度为平均 O(1),最坏 O(n)。
    快速插入和删除:unordered_set 容器提供了非常快的插入和删除操作,时间复杂度为平均 O(1),最坏 O(n)。
  • 实现

unordered_set 容器的实现是基于 hash table 数据结构的。hash table 使用哈希函数来将元素映射到容器中的索引上,使得查找、插入和删除操作变得非常快。

  • 常用操作
  1. 插入:使用 insert 方法将元素插入到 unordered_set 容器中。如果元素已经存在,将不会被插入。
unordered_set<int> mySet;
mySet.insert(10);
mySet.insert(20);
  1. 遍历:使用迭代器遍历 unordered_set 容器中的元素。
for (auto it = mySet.begin(); it != mySet.end(); ++it) {cout << *it << " ";
}
  1. 查找:使用 find 方法在 unordered_set 容器中查找特定元素。如果找到,将返回该元素的迭代器;否则,将返回结束迭代器。
auto it = mySet.find(20);
if (it != mySet.end()) {cout << "Element found in set";
}
  1. 删除:使用 erase 方法删除 unordered_set 容器中的元素。
mySet.erase(10);
  • 优点
  1. 快速查找:unordered_set 容器提供了非常快的查找操作,时间复杂度为平均 O(1),最坏 O(n)。

  2. 快速插入和删除:unordered_set 容器提供了非常快的插入和删除操作,时间复杂度为平均 O(1),最坏 O(n)。

  3. 低内存占用:unordered_set 容器的内存占用相对较低,因为hash table 需要的内存空间少。
    缺点

  4. 无顺序:unordered_set 容器中的元素是无序的,无法维护元素的顺序。

  5. 可能存在哈希碰撞:如果哈希函数不够完善,可能会出现哈希碰撞,导致查找、插入和删除操作变得慢。

  • 应用场景
  1. 快速查找:unordered_set 容器非常适合需要快速查找操作的场景。
  2. ** cache实现**:unordered_set 容器可以用于实现 cache,快速地查找和存储缓存内容。
  3. 集合操作:unordered_set 容器可以用于实现集合操作,如 union、intersection、difference 等。

三.两者选择场景

set 和 unordered_set 都是 C++ 的关联容器,用于存储唯一的元素,但是它们有不同的实现和特点,选择哪一个取决于具体的使用场景和需求。

  • 选择 set 的场景
  1. 需要有序:如果需要元素保持特定的顺序,例如按照升序或降序排列,那么 set 是不二之选。set 使用红黑树作为底层数据结构,能够维护元素的顺序。
  2. 需要遍历元素:如果需要遍历整个容器,例如 foreach 循环,set 提供了更好的遍历性能,因为红黑树的遍历效率高于哈希表。
  3. 元素类型支持排序:如果元素类型支持排序,例如 int、string 等,那么 set 可以使用这个排序规则来维护元素的顺序。
  • 选择 unordered_set 的场景
  1. 需要快速查找:如果需要快速查找特定元素,例如频繁地查找特定元素,那么 unordered_set 是不二之选。unordered_set 使用哈希表作为底层数据结构,能够提供 O(1) 的平均查找时间。
  2. 需要快速插入和删除:如果需要频繁地插入和删除元素,那么 unordered_set 是不二之选。unordered_set 提供了 O(1) 的平均插入和删除时间。
  3. 元素类型不支持排序:如果元素类型不支持排序,例如自定义类, 那么 unordered_set 是不二之选,因为哈希表不需要元素类型支持排序。
  • 其他考虑因素
  1. 内存占用:unordered_set 通常需要更少的内存,因为哈希表需要的内存空间少。
  2. 哈希函数:如果使用 unordered_set,需要提供一个良好的哈希函数,以避免哈希碰撞。
  3. ** Collision resolution**:如果使用 unordered_set,需要选择合适的 Collision resolution 策略,以避免哈希碰撞。
  • 结论

如果需要元素保持顺序或需要遍历整个容器,选择 set。如果需要快速查找、插入和删除元素,并且元素类型支持哈希函数,那么选择 unordered_set。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的智能城市解决方案

基于Java的智能城市解决方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨基于Java的智能城市解决方案&#xff0c;探索如何利用现代技术构建智…

【Python数据分析及环境搭建】:教程详解1(第23天)

系列文章目录 Python进行数据分析的优势常用Python数据分析开源库介绍启动Jupyter服务Jupyter Notebook的使用 文章目录 系列文章目录前言学习目标1. Python进行数据分析的优势2. 常用Python数据分析开源库介绍2.1 NumPy2.2 Pandas2.3 Matplotlib2.4 Seaborn2.5 Sklearn2.6 Ju…

[AHK V2]鼠标悬停展开窗口,鼠标离开折叠窗口

演示鼠标悬停窗口标题栏则展开窗口&#xff0c;鼠标离开窗口标题栏则折叠窗口。 ;作者&#xff1a;sunwind ;日期&#xff1a;2024年6月30日11:36:08 ;脚本&#xff1a;演示鼠标悬停窗口标题栏则展开窗口&#xff0c;鼠标离开窗口标题栏则折叠窗口。 MyGui : Gui() mytext:MyG…

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

第一篇-STM32智能小车硬件介绍 后续章节也放这里 持续更新中&#xff0c;视频发布在小B站 里面。这边也会更新。 B站视频合集: STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 小B站链接:https://www.bilib…

启航IT世界:高考后假期的科技探索之旅

随着高考的落幕&#xff0c;新世界的大门已经为你们敞开。这个假期&#xff0c;不仅是放松身心的时光&#xff0c;更是为即将到来的IT学习之旅打下坚实基础的黄金时期。以下是一份专为你们准备的IT专业入门预习指南&#xff0c;希望能助你们一臂之力。 一&#xff1a;筑基篇&a…

STM32F407ZGT6驱动TFT屏ILI9341(硬件SPI)

硬件连接 我购买的是ili9341,2.8inch&#xff0c;带触摸 开发板是野火stm32f407霸天虎 LCD模块STM32单片机VCCDC5V/3.3VGNDGNDSDI(MOSI)PB5SDO(MISO)PB4LEDPB13SCKPB3DC/RSPB14RSTPB12CSPB15触摸连接T_IRQPB1T_DOPB2T_DINPF11T_CSPC5T_CLKPB0 初始化 本次使用的是硬件SPI1&…

Bootstrap 缩略图

Bootstrap 缩略图 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式和移动优先的网页。缩略图(Thumbnails)是 Bootstrap 中的一种组件,用于展示图片或其他媒体内容,通常与标题和文本描述一起使用,形成一个整洁的布局。本文…

新版MinIO安装,附带问题处理和SSL设置(巨详细)

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 下面开始&#xff1a; 前往官网下载需要的二进制文件 wget https://dl.min.io/server/minio/release/linux-am…

element ui中的scss语法理解

摘录至 导读 首先来看一个bem命名示例 .el-message-box{} .el-message-box__header{} .el-message-box__header--active{}如果使用已经封装好的bem方法的话&#xff0c;那么可以写成 include b(message-box) {include e(header) {include m(active);} }接下来我们来看一下b…

【FPGA】Verilog:全减器与半减器 | Full Subtractor | Half Subtractor

0x00 全减器(Full Subtractor) 减法器是用于减法运算的逻辑电路,与不包含借位的半减法器不同。 全减法器因为包含借位的产生与否,所以具备完整的减法功能。 输出由差 和借位 组成:

JUC基础学习

1.Java JUC简介 2.volatile关键字-内存可见性 3.原子变量-CAS算法 4.ConcurrentHashMap锁分段机制

什么是滴答定时器?

滴答定时器&#xff08;Tick Timer&#xff09;是一种关键的硬件组件&#xff0c;用于生成固定时间间隔的信号。这些信号通常称为“滴答”&#xff08;tick&#xff09;&#xff0c;是操作系统和应用程序的时间管理基础。滴答定时器的应用范围广泛&#xff0c;从简单的定时任务…

Java中的数据加密与安全传输

Java中的数据加密与安全传输 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下在Java中如何实现数据加密与安全传输。 随着互联网的普及和网络…

C++学习/复习18----迭代器/反向迭代器及在list/vector中的应用、list与vector模拟实现复习

迭代器是一个对象&#xff0c;可以循环访问 C 标准库容器中的元素&#xff0c;并提供对各个元素的访问。 C 标准库容器全都提供迭代器&#xff0c;以便算法可以采用标准方式访问其元素&#xff0c;而不必考虑用于存储元素的容器类型。 一、反向迭代器类 基于普通迭代器构建反…

使用gitlab的CI/CD实现logseq笔记自动发布为单页应用

使用gitlab的CI/CD实现logseq笔记自动发布为单页应用 使用gitlab的CI/CD实现logseq笔记自动发布为单页应用如何实现将logseq的笔记发布成网站使用 logseq-publish-docker 实现手动发布使用gitlab的CI/CD实现自动发布过程中的问题及解决参考资料 使用gitlab的CI/CD实现logseq笔记…

[AIGC] 常用的OLAP数据库:为数据分析提供强大的支持

导语&#xff1a;在大数据时代&#xff0c;数据分析成为了企业决策的重要依据。为了高效地处理和分析海量的数据&#xff0c;OLAP数据库应运而生。本文将介绍几种常用的OLAP数据库&#xff0c;为数据分析提供强大的支持。 一、Snowflake Snowflake是一种云原生的OLAP数据库&a…

win10和mac之间如何共享文件夹

我用的mac版本是 macOS Ventura &#xff0c;其他版本的操作可能略有不同 在 macOS Ventura 上设置共享文件夹 打开“系统设置”&#xff1a;点击屏幕左上角的苹果菜单 () > 系统设置。选择“通用”&#xff1a;在左侧边栏中找到并点击“通用”。选择“共享”&#xff1…

第二届重庆国际渔业博览会

The 2th Chongqing International Fisheries & Seafood Expo 时间&#xff1a;2024年10月25-27日 地点&#xff1a;重庆国际博览中心 同期举办&#xff1a;第十六届中国(重庆)火锅美食文化节暨第九届中国(重庆)国际火锅产业博览会 展会规模&#xff1a; 展出…

利用Java的`java.util.concurrent`包优化多线程性能

利用Java的java.util.concurrent包优化多线程性能 一、引言 在Java的多线程编程中&#xff0c;性能优化是一个永恒的话题。随着多核CPU的普及和计算任务的日益复杂&#xff0c;多线程编程已经成为提高应用程序性能的重要手段。然而&#xff0c;多线程编程也带来了一系列的问题…

(论文版)深度学习 | 基于 VGG16-UNet 语义分割模型的猫狗图像提取研究

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本实验本项目基于 VGG16-UNet 架构&#xff0c;利用 Labelme 标注数据和迁移学习&#xff0c;构建高效准确的猫狗图像分割模型。通过编码器-解码器结构&#xff08;特征提取-上采样&#xff09;提升分割精度&#xff0c;适应不同…