STL——set与unordered_set

ops/2024/9/20 3:58:37/ 标签: c++, 开发语言

set和unorded_set都是只读的,因为是基于排序的容器,直接更改元素会破坏其内部结构。

如果直接存储对象,那么默认都是拷贝语义,STL容器中的数据更改是不会影响到原数据的

set

提供了有序、唯一的容器。

内部实现通常是基于红黑树(自平衡AVL)实现

multiset则可以重复,因为插入时不会监测数据,故可以插入重复数据,而set会检测重复数据,但也会进行排序

插入、删除、操作上都是O(logn)

set常见操作

  • set<T> st; //默认构造

  • set<const set &st>; //拷贝构造

  • set& operator=(const set &st); //重载等号操作符

  • insert(const T& value) //插入元素,若元素已存在,则不会改变set

  • erase(const T& value) //通过指定元素值来删除元素

  • find(const T& value) //查找给定值的元素,返回一个指向该元素的迭代器,若是没找到返回end()

  • size() //返回set元素数量

  • count(key) //返回key的元素个数

  • 遍历可以使用 std::set iterator来遍历,迭代将按元素的排序顺序进行

排序:

默认按照从小到大,可以使用仿函数指定set容器的排序规则

class MyCompare 
{
public:bool operator()(int v1, int v2) {return v1 > v2;}
};
int main(){set<int,MyCompare> s1;s1.insert(10);s1.insert(40);s1.insert(20);s1.insert(30);s1.insert(50);for(set<int,MyCompare>::iterator it = s1.begin();it != s1.end();it++){cout << *it;}cout << endl;
}

对于自定义类型,同样可以利用仿函数进行排序,需要注意爹是,对于自定义数据类型,set必须指定排序规则才能插入数据

unordered_set

基于哈希表实现,故在插入、删除和查找操作能在常数复杂度O(1)实现

也保持了元素的唯一性,但不会根据元素的值进行自动排序

提供的常见操作接口与set一致,不赘述,需要注意的是,遍历时下顺序是不确定的

适合于需要用于快速查找、删除和插入唯一元素,但不关心元素顺序的场景

cout(key); //统计key的元素个数,在set或者unordered_set中是0或1,但是在multiset中则数目不同


http://www.ppmy.cn/ops/31180.html

相关文章

Android使用kts上传aar到JitPack仓库

Android使用kts上传aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑. 1.创建项目(library方式) 由于之前用鸿神的w…

非关系型数据库-Redis

Redis Redis是一个开源的内存数据库系统&#xff0c;其主要用途是作为高速缓存、消息队列和键值存储系统。Redis具有丰富的数据结构和功能&#xff0c;可以支持字符串、哈希、列表、集合和有序集合等数据类型。它以其快速、可扩展和高可用性而闻名&#xff0c;并且具有对事务、…

Apache Kafka知识点表格总结

之前的项目中用到RabbitMQ比较多&#xff0c;也有用到RocketMQ,&#xff0c;虽然项目中没有用到过Kafka&#xff0c;不过自己在空闲时间学习过,而且在面试中也会问到&#xff0c;因为还是有不少公司用到Kafka&#xff0c;所以做个总结&#xff0c;一方面是做为面试参考&#xf…

# IDEA 复制项目 Module 出现 不同模块下的 Product 类报错

IDEA 复制项目 Module 出现 不同模块下的 Product 类报错 我们 用 IDEA 复制项目 Module 出现 不同模块下的 Product 类报错&#xff0c;发现复制的 module 名称没有改变或者 java 文件夹后面还有原项目 source root 字样&#xff0c;maven 父子项目没有标识等问题。 解决方法…

Unity坐标相关——坐标系,单位

三维软件使用的坐标系分为&#xff1a;左手坐标系和右手坐标系 unity使用左手坐标系 左手坐标系和右手坐标系的区分方法&#xff1a; 在空间直角坐标系中&#xff0c;让左手拇指指向x轴的正方向&#xff0c;食指指向y轴的正方向&#xff0c;如果中指能指向z轴的正方向&#…

黑马面试篇1

目录 一、面试准备 二、Redis篇 ​编辑1. 布隆过滤器&#xff1a; 2. 缓存击穿概念&解决方案 3. 双写一致 4. 持久化 1&#xff09;RDB的执行原理&#xff1f; 2&#xff09;AOF vs RDB 5. 数据过期策略 6. 数据淘汰策略 7. 分布式锁 8. Redis集群 1&#xff…

supervisor 简单理解

1. 找到配置文件&#xff0c;/etc/supervisor/supervisor.conf 添加 [include] files /www/server/panel/plugin/supervisor/profile/*.ini test.ini文件内容 [program:rabbitmq-consume] process_name%(program_name)s_%(process_num)02d directory/www/wwwroot command/w…

C语言结课总结与示例代码

经过一学期的学习&#xff0c;我们终于完成了C语言的学习旅程。C语言作为计算机编程的基石&#xff0c;为我们后续学习更高级的语言和深入理解计算机内部机制打下了坚实的基础。在这里&#xff0c;我想对这学期的学习进行一下总结&#xff0c;并通过一些示例代码来回顾我们学过…

uboot-网络配置

文章目录 一、网络简介二、修改PHY芯片地址三、删除 uboot 中 74LV595 的驱动代码1.删除宏定义&#xff0c;添加ENET1和ENET2复位引脚&#xff0c;宏定义2.删除内容如下 四、添加 I.MX6U-ALPHA 开发板网络复位引脚驱动 一、网络简介 &#x1f4a6;I.MX6UL/ULL 内部有个以太网 …

JavaScript的流程控制

前言&#xff1a; 本部分内容可以参考C/C的相应知识点&#xff0c;不过多解释。 判断&#xff1a; if&#xff1a; if(判断条件){执行内容 } 如果判断为真&#xff0c;则执行内容&#xff1b;反之则不执行。 if-else&#xff1a; if(判断条件){执行内容1 } else{执行内容2 } 如…

精品UI知识付费系统源码 响应式视频教程知识付费软件下载网站模板

这是一款知识付费平台模板&#xff0c;后台可上传本地视频&#xff0c;批量上传视频连接&#xff0c; 视频后台可设计权限观看&#xff0c;免费试看时间时长&#xff0c;会员等级观看&#xff0c;付费观看等功能&#xff0c; 也带软件app权限下载&#xff0c;帮助知识教育和软…

php使用rabbitmq

这里使用的是 php-amqplib composer require php-amqplib/php-amqplib生产端send.php <?phprequire_once "./vendor/autoload.php";use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage;//交换机名称 $exc_name exchange.can…

领域驱动设计(DDD)笔记(三)后端工程架构

文章链接 领域驱动设计(DDD)笔记(一)基本概念-CSDN博客领域驱动设计(DDD)笔记(二)代码组织原则-CSDN博客领域驱动设计(DDD)笔记(三)后端工程架构-CSDN博客前导 领域驱动设计(Domain Driven Design,简称DDD)是业内主导的业务工程理论。它在各中权威人士被广泛讨论…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

腾讯云ubuntu新建用户后,命令行只显示$

这是因为&#xff0c;新建用户命令行解释器默认是sh&#xff0c;需要手动切换为bash&#xff0c;bash可以认为是sh的加强版本。 所以我们只需要将&#xff0c;shell切换为bash就好了。 切换到root 修改配置文件 vim/etc/bash 将sh修改为bash

Flask知识点汇总表格总结

最近接手的Python项目有两个&#xff0c;一个是Django项目&#xff0c;一个是Flask项目&#xff0c;Django昨天做了一个比较全面的总结&#xff0c;今天再就Flask做一个知识总结。我这相当于是项目驱动学习类型。 Flask是一个轻量级的Python Web应用框架&#xff0c;它被设计为…

(优作)基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)竞赛作品

基于STM32蓝牙控制小车系统设计&#xff08;硬件源代码论文&#xff09;竞赛作品 基于意法半导体与ARM公司生产的STM32F4 DISCOVERY开发板的集电机驱动模块、电源管理模块、stm32f4主控模块、蓝牙串口通信模块、android控制端模块。电机驱动模块使用了两个L298N芯片来驱动4路电…

从零开始搭建一个vue项目

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本&#xff0c;然后下载安装&#xff0c;安装地址&#xff1a;https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…

python - mac安装mysqlclient

参考 https://github.com/PyMySQL/mysqlclient 安装 xcode xcode-select --install安装mysql brew uninstall mysql brew install mysql8.0启动 mysql-server 命令如下 brew services start mysql8.0安装 mysql-client brew uninstall mysql-client wget https://raw.git…