C++:有序关联容器set

news2024/9/23 1:35:53

什么是有序关联容器

(1)顺序容器,容器中的元素是按它们在容器中的位置来顺序保存和访问的(可以理解是数组)
(2)顺序容器有array、vector、deque、list、forward_list、string等
(3)关联容器中的元素是按关键字来保存和访问的,关联的意思就是关键字(key)与存储值(value)的关联
(4)主要的关联容器类型是map和set
(5)关联容器支持高效的关键字查找和访问
(6)有序关联容器:容器内元素按顺序排列,一般用树(譬如红黑树)来实现
(7)无序关联容器:容器内元素无顺序排列,一般用哈希表来实现,本质上是一种映射

set的基本使用

(1)set的基本理解:就是一个用来装Key类型对象的筐子,数学上叫集合
(2)set的构造函数
(3)插入数据可以用insert,插入时内部自动排序,元素是唯一的
(4)查询set中元素个数用:empty、size,max_size是理论上的最大元素数
(5)清除全部元素用clear
(6)针对清除某个Key用erase,若erase的元素不存在则不报错

set的三种遍历方法

(1)使用ranged for

#include <iostream>  
#include <set>  
  
int main() {  
    std::set<int> mySet = {1, 2, 3, 4, 5};  
  
    for (int elem : mySet) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

(2)使用迭代器写for循环


```c
#include <iostream>  
#include <set>  
  
int main() {  
    std::set<int> mySet = {1, 2, 3, 4, 5};  
  
    // 使用范围for循环遍历  
    for (int elem : mySet) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}
(3)使用std::for_each

```c
#include <iostream>  
#include <set>  
#include <algorithm>  
  
void printElement(int elem) {  
    std::cout << elem << " ";  
}  
  
int main() {  
    std::set<int> mySet = {1, 2, 3, 4, 5};  
  
    // 使用std::for_each遍历  
    std::for_each(mySet.begin(), mySet.end(), printElement);  
    std::cout << std::endl;  
  
    return 0;  
}

谓词可以是函数对象、函数、lambda表达式

set的原地构造

(1)set插入新元素一共有3个方法:insert、emplace、emplace_hint
(2)一般来说,emplace比insert效率更高,参考:http://c.biancheng.net/view/6834.html

在这里插入图片描述

移动构造

移动构造函数
(1)移动构造函数特征:传参是一个右值引用的对象(对比copy构造函数)
(2)右值引用的特征就是&&,
(3)右值引用对应移动语义,对应移动构造函数;而左值引用对应复制语义,对应复制构造函数
(4)移动语义就是直接把右值的临时对象给左值,而不是复制右值给左值重新构造一份
(5)移动构造函数可以避免不必要的深拷贝,这在很多时候可以提升效率
(6)此处案例,如果不提供移动构造函数,则会退而匹配调用拷贝构造函数,但不影响insert和emplace的对比

在这里插入图片描述

extract

std::set 引入了 extract 方法,该方法允许从 std::set 中移除一个元素,并返回一个包含该元素的 std::optional<std::set::node_type>。这个node_type 是一个指向 std::set 内部节点的指针,允许你以非破坏性的方式处理这个元素(例如,检查其内容或重新插入到另一个容器中)。如果容器为空或找不到元素,extract 将返回一个空的 std::optional。

#include <set>  
#include <optional>  
#include <iostream>  
  
int main() {  
    std::set<int> s = {1, 2, 3, 4, 5};  
  
    auto extracted = s.extract(3);  
    if (extracted) {  
        std::cout << "Extracted: " << extracted->value() << std::endl;  
  
        // 可以选择性地重新插入到另一个集合  
        // std::set<int> s2;  
        // s2.insert(std::move(extracted.value()));  
        // extracted = std::nullopt; // 必须显式重置extracted,因为node的所有权已转移  
    }  
  
    // s现在不再包含3  
    for (int x : s) {  
        std::cout << x << ' ';  
    }  
    std::cout << std::endl;  
  
    return 0;  
}
#include <iostream>  
#include <set>  
  
int main() {  
    // 创建一个空的set  
    std::set<int> mySet;  
  
    // 插入元素  
    mySet.insert(10);  
    mySet.insert(5);  
    mySet.insert(15);  
    mySet.insert(20);  
  
    // 遍历set(注意:set会自动排序)  
    std::cout << "遍历set(已排序):" << std::endl;  
    for (int elem : mySet) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    // 查找元素  
    auto it = mySet.find(15);  
    if (it != mySet.end()) {  
        std::cout << "找到元素:" << *it << std::endl;  
    } else {  
        std::cout << "未找到元素" << std::endl;  
    }  
  
    // 删除元素  
    size_t num_erased = mySet.erase(10);  
    if (num_erased) {  
        std::cout << "删除元素10成功" << std::endl;  
    }  
  
    // 再次遍历set以查看删除效果  
    std::cout << "删除元素后再次遍历set:" << std::endl;  
    for (int elem : mySet) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    // 获取set的大小  
    std::cout << "set的大小为:" << mySet.size() << std::endl;  
  
    // 清空set  
    mySet.clear();  
  
    // 检查set是否为空  
    if (mySet.empty()) {  
        std::cout << "set已清空" << std::endl;  
    }  
  
    return 0;  
}

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

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

相关文章

STM32-外部中断-AFIO-串口-串口通信-串口中断(空闲中断和接收中断)-printf移植-ADC数模转换-初始化和读取光敏电阻AO

常用的中断包括外部中断、串口中断、定时器中断&#xff1b; 1、外部中断&#xff1a; 引脚复用按钮导致的外部中断&#xff1a; 注意&#xff1a;初始化引脚&#xff0c;添加引脚和EXTI输入线的映射&#xff1b;使用外部引脚的中断时需要使用AFIO映射&#xff1b; 操作步骤&…

如何获取android的SHA1或SHA256

在使用地图类的功能时&#xff0c;例如百度地图或者高德地图&#xff0c;会需要在开发者平台里填写SHA1或SHA256的指纹密钥&#xff0c;很多开发者小伙伴还不知道如何获取。当然关于如何获取android的SHA1或SHA256&#xff0c;网络上进行搜索已经有很多图文教程了&#xff0c;本…

mfc140u.dll丢失的科学修复手段,简单又方便的mfc140u.dll修复

遇到 "缺失 mfc140u.dll 文件" 的提示时可能会让你疑惑&#xff0c;但不用担心。这个文件是 Microsoft Visual C 2015 的重要组成部分&#xff0c;对运行特定程序非常关键。幸运的是&#xff0c;解决这一问题并不难。本文将简单指导你如何恢复或修复丢失的 mfc140u.d…

多台PC网络ADB连接同一台RK3399 Android7.1.2设备

在RK3399 Android7.1.2上面&#xff0c;进行网络ADB调试时&#xff0c;如果多台电脑连接同一台Android设备&#xff0c;第一台连接上的能正常操作&#xff0c;之后连接的看到设备状态为OFFLINE&#xff0c;分析了下ADBD相关代码&#xff0c;发现在ACCEPT Client的时候没有区分别…

设计师必备:2024最新PDF转CAD软件盘点

随着科技的飞速发展&#xff0c;设计师们不再受限于传统的设计流程&#xff0c;可以利用一些新欣的工具来提升工作效率、优化工作流程的新工具。其中&#xff0c;PDF转CAD工具成为了设计行业的一大热门话题。面对海量的数据和复杂的设计需求&#xff0c;一款高效、精准的PDF转C…

11、MySQL-SQL优化

目录 1、插入数据 1.1、批量插入 1.2、手动提交事务 1.3、主键顺序插入 1.4、大批量插入数据 2、主键优化 2.1 页分裂 2.2 主键顺序插入 2.3 主键乱序插入 2.4 页合并 2.5 主键的设计原则 3、order by优化 4、group by优化 5、limit优化 6、count优化 6.1 coun…

【Bifrost】ubuntu24.04 远程构建及clion设置编码风格google

Bifrost 构建通过clion 远程到ubuntu24.04 构建感觉是不认识这种写法,这种至少是c++11 fix : 修改absl 的构建cmakelist,明确c++17 好像还是不行error: ‘uint8_t’ was not declared in this scope加入:#include <stdint.h>可以解决一部分。那么,这种呢?/home/zha…

浅谈 DNS 篡改劫持

故事背景&#xff1a;产品反馈线上站点操作后跳转至空白页面&#xff0c;浏览器 URL 地址异常&#xff0c;ping 命令测试后定位可能是 DNS 解析异常&#xff0c;联系七牛云技术人员排查&#xff0c;反馈是由于带宽突变&#xff0c;触发节点防攻击策略所致&#xff0c;后续先调整…

keepalived安装-集群部署

1.服务器信息 服务器版本服务器IP介质版本安装用户CentOS Linux release 7.9.2009 (Core)192.168.10.244keepalived-2.2.8.tar.gz nginx-1.26.1 rootCentOS Linux release 7.9.2009 (Core)192.168.10.245keepalived-2.2.8.tar.gz nginx-1.26.1 root2.服务器基础配置 参考:Lin…

二、AI工作流(低代码)-输入-文本组件详解

对工作流感兴趣的小伙伴可以去试一试。&#x1f525;偷偷的告诉你&#xff0c;它的GPTo4.0 mini 不要&#x1f4b0;。传送门&#xff1a;https://www.nyai.chat/chat?invitenyai_1141439 一、能用AI工作流介绍 能用AI-工作流是一个“低代码”工具、它也是个人或者中小企业的…

Spring源码调试环境搭建(IDEA)

文章目录 引言开发环境搭建步骤步骤一&#xff1a;下载 Spring Boot 源码步骤二&#xff1a;导入项目到 IntelliJ IDEA步骤三&#xff1a;处理build报错报错一报错二 测试步骤新建module修改build.gradle新建测试类启动测试 引言 无论是面试&#xff0c;还是工作&#xff0c;S…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu系统部署及应用歌唱语音转换框架NeuCoSVC:歌曲音色转换工具

目录 论文简介 部署 模型下载 编译REAPER 最后 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a;《Neural Concate…

模拟三层--控制层、业务层和数据访问层

三层的概念:https://developer.aliyun.com/article/1390024 一、新建一个项目 我新建好的项目名为spring__ioc_02,然后在 src-main-java 下建立三层&#xff08;数据访问层、业务层和控制层&#xff09;的包 dao、service 和controller、并在包下建立相应的接口和实现类 Proje…

网络命令之查看网口最大网速的一些方法?(/sys/class/net/ethx/speed、ethtool ethx)

文章目录 背景方法1: sysfs的net方法2&#xff1a;ethtool方法3&#xff1a;通过网卡型号获取方法4&#xff1a;通过网卡lspci输出信息直接获取方法5&#xff1a;高性能网卡可以通过物理连线光口信息获取后记 背景 经常需要查看不同网卡的网速&#xff0c;甚至相同大版本型号网…

一个简单的pytorch项目框架

框架的基本功能&#xff1a; 1. 模型的定义、训练与测试 2. 数据生成与数据迭代器 3. 训练日志记录 4. 训练过程实时监控 有了这个框架&#xff0c;后续所有复杂的AI项目都可以在此基础上拓展开发。 项目基本结构&#xff1a; 四个文件&#xff1a; sequence_mean_generate…

C++初阶_2:引用

本节咱们来说说引用&#xff1a; C添加了“引用”&#xff0c;与指针成了两兄弟——这两兄弟对我们今后写C代码可谓各有特点&#xff0c;缺一不可。 何谓引用&#xff1f; 引用&#xff1a;就是取别名 不知诸位可有别名&#xff1f;这里不妨举一本耳熟能详的小说《水浒传》&…

Redis16-批处理优化

目录 Pipeline 集群下的批处理 Pipeline 单个命令的执行流程&#xff1a; N条命令的执行流程&#xff1a; N条命令批量执行&#xff1a; Redis提供了很多Mxxx这样的命令&#xff0c;可以实现批量插入数据&#xff0c;例如&#xff1a; msethmset 利用mset批量插入10万条数…

vivado报错:file ended before end of clause

最近在学习Xilinx FPGA时&#xff0c;遇到 Vivado 报错如下图所示&#xff1a; 刚开始&#xff0c;看到错误是在第1行代码中出现的&#xff0c;我的第一反应是该行代码写错了&#xff0c;然后搜了搜语法&#xff0c;发现没错。 分析报错信息发现&#xff0c;该错误应该是和文件…

VScode + PlatformIO 和 Keil 开发 STM32

以前经常使用 KEIL 写 STM32 的代码&#xff0c;自从使用 VScode 写 ESP32 后感觉 KEIL 的开发环境不美观不智能了&#xff0c;后面学习了 VScode 开发 STM32 。 使用过程中发现 串口重定向在 KEIL 中可以用&#xff0c;搬到 VScode 后不能用&#xff0c;不用勾选 Use Micro LI…

SpringMVC 运行流程

SpringMVC 运行流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; SpringMVC的运行流程可概括为以下几个核心步骤&#xff1a; 流程图&#xff1a; #mermaid-svg-l1CeK9JwP5wRQjBL {font-family:"trebuchet ms",verdana,arial,…