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

《C++进阶之STL》【set/map 使用介绍】

关联容器的核心特征是非线性逻辑结构通常基于树如红黑树或哈希表实现元素间通过键值的有序性或哈希映射建立关联例如二叉搜索树中左子树元素键值始终小于根节点右子树元素键值始终大于根节点形成紧密的逻辑关联结构敏感性交换元素会破坏容器的内部逻辑结构如树的有序性或哈希表的映射关系导致后续操作如查找、插入失效关键字驱动访问元素按关键字Key存储和检索而非位置例如map容器通过键值对(key, value)存储数据查找时直接通过key定位时间复杂度为O(logn)红黑树实现或平均O(1)哈希表实现两类容器的核心差异总结维度序列式容器关联式容器逻辑结构线性序列数组、链表等非线性结构树、哈希表等元素关联仅通过位置的顺序关联通过键值的有序或哈希的映射关联访问依据存储位置索引或迭代器关键字Key典型实现vector、list、dequeset、mapunordered_set、unordered_map------------set------------一、介绍cplusplus网站上关于C的set容器的介绍set - C Reference在这里插入图片描述在这里插入图片描述在这里插入图片描述代码语言javascriptAI代码解释template class T, // set::key_type/value_type class Compare lessT, // set::key_compare/value_compare class Alloc allocatorT // set::allocator_type class set;关于 C STL 中set容器的模板参数说明元素类型T set 底层存储的关键字类型需保证该类型支持比较操作默认需支持运算符比较器Compare默认lessT用于定义元素间的排序规则。若T不支持默认比较如自定义类或需自定义排序逻辑可通过仿函数重载比较规则代码语言javascriptAI代码解释struct MyComparator { bool operator()(const T a, const T b) const { return a.custom_key b.custom_key; // 自定义比较逻辑 } }; setT, MyComparator mySet; // 使用自定义比较器内存分配器Allocator默认allocatorT负责管理 set 的内存分配与释放。如需优化内存使用如高频插入/删除场景可自定义分配器如内存池代码语言javascriptAI代码解释setT, lessT, MyAllocatorT mySet; // 使用自定义分配器C 标准模板库STL中的set容器相关知识主要可以分为以下一个部分成员函数提供了set 容器的各类操作接口涵盖元素插入、删除、查找、迭代、容量管理等功能。在这里插入图片描述1. set容器的常见构造在这里插入图片描述代码语言javascriptAI代码解释// constructing sets #include iostream #include set //1.定义一个普通函数作为比较函数用于比较两个整数的大小 bool fncomp(int lhs, int rhs) { return lhs rhs; } //2.定义一个函数对象仿函数类用于比较两个整数的大小 struct classcomp { bool operator() (const int lhs, const int rhs) const { return lhs rhs; } }; int main() { /*------------------使用不同的构造函数创建set容器------------------*/ //1.使用“默认构造函数”创建一个空的set元素类型为int std::setint s1; //2.使用“迭代器范围构造函数”创建包含5个元素的set初始化元素来自数组myints int myints[] { 10,20,30,40,50 }; std::setint s2(myints, myints 5); //3.使用“拷贝构造函数”创建set容器thirdthird是second的一个副本 std::setint s3(s2); //4.使用“迭代器构造函数”创建set通过迭代器范围[second.begin(), second.end())初始化 std::setint s4(s2.begin(), s2.end()); //注意这实际上和拷贝构造效果相同 /*------------------使用不同的方式作为set容器的比较器------------------*/ //5.使用“自定义的函数对象”作为比较器 std::setint, classcomp s5; //注意classcomp是一个定义了函数调用运算符的结构体 //6.使用“函数指针”作为比较器 //6.1首先定义一个函数指针指向fncomp函数 bool(*fn_pt)(int, int) fncomp; //6.2然后在模板参数中指定比较器类型并在构造函数中传入函数指针 std::setint, bool(*)(int, int) s6(fn_pt); return 0; }在这里插入图片描述2. 容量的操作std::set::size在这里插入图片描述代码语言javascriptAI代码解释// set::size #include iostream #include set int main() { std::setint myints; std::cout 初始状态下的set大小的size为: myints.size() \n; for (int i 0; i 10; i) myints.insert(i); std::cout 插入10个元素后set大小的size为: myints.size() \n; myints.insert(100); std::cout 插入元素100后set大小的size为: myints.size() \n; myints.erase(5); std::cout 删除5个元素后set大小的size为: myints.size() \n; return 0; }在这里插入图片描述std::set::empty在这里插入图片描述代码语言javascriptAI代码解释// set::empty #include iostream #include set int main() { std::setint myset; myset.insert(20); myset.insert(30); myset.insert(10); std::cout myset容器中的内容为:; while (!myset.empty()) { std::cout *myset.begin(); myset.erase(myset.begin()); } std::cout \n; return 0; }在这里插入图片描述3. 修改的操作std::set::clear在这里插入图片描述代码语言javascriptAI代码解释// set::clear #include iostream #include set int main() { std::setint myset; myset.insert(100); myset.insert(200); myset.insert(300); std::cout 初始状态下myset容器中的内容为:; for (std::setint::iterator it myset.begin(); it ! myset.end(); it) { std::cout *it; } std::cout \n; myset.clear(); myset.insert(1101); myset.insert(2202); std::cout 进行清空和插入操作后myset容器中的内容为:; for (std::setint::iterator it myset.begin(); it ! myset.end(); it) { std::cout *it; } std::cout \n; return 0; }在这里插入图片描述std::set::swap在这里插入图片描述代码语言javascriptAI代码解释// swap sets #include iostream #include set int main() { int myints[] { 12,75,10,32,20,25 }; std::setint first(myints, myints 3); // 10,12,75 std::setint second(myints 3, myints 6); // 20,25,32 first.swap(second); std::cout 交换后first容器中的内容为:; for (std::setint::iterator it first.begin(); it ! first.end(); it) { std::cout *it; } std::cout \n; std::cout 交换后second容器中的内容为:; for (std::setint::iterator it second.begin(); it ! second.end(); it) { std::cout *it; } std::cout \n; return 0; }在这里插入图片描述std::set::insert在这里插入图片描述代码语言javascriptAI代码解释// set::insert (C98) #include iostream #include set int main() { //1.创建一个存储int类型的set容器 std::setint myset; //2.定义一个迭代器用于指向set中的元素 std::setint::iterator it; //3.定义一个pair对象用于接收insert函数的返回值 std::pairstd::setint::iterator, bool ret; /* 注意事项 * 1.第一个元素是迭代器指向插入的元素或已存在的元素 * 2.第二个元素是bool值表示插入是否成功 */ /*--------------------插入形式一单个元素的插入--------------------*/ for (int i 1; i 5; i) { myset.insert(i * 10); } //1.尝试插入已存在的元素20元素已存在 ret myset.insert(20); /* 注意事项 * 1.返回的pair中bool值为false表示插入失败 * 2.迭代器指向已存在的元素20 */ //2.如果插入失败将迭代器it指向已存在的元素20 if (ret.second false) it ret.first; std::cout myset容器中的内容为:; for (it myset.begin(); it ! myset.end(); it) { std::cout *it; } std::cout \n; /*--------------------插入形式二带提示位置的插入--------------------*/ myset.insert(it, 25); //注意提示位置为it指向元素20实际插入位置由set的有序性决定 myset.insert(it, 24); //元素24会被插入到20之后按升序排列 myset.insert(it, 26); /* 注意事项 * 1.提示位置对插入位置没有帮助26应在25之后 * 2.提示位置仅作为优化建议不影响最终插入位置 */ std::cout myset容器中的内容为:; for (it myset.begin(); it ! myset.end(); it) { std::cout *it; } std::cout \n; /*--------------------插入形式三范围插入--------------------*/ int myints[] { 5,10,15 }; myset.insert(myints, myints 3); //注意会插入5, 10, 15三个元素但10已存在不会重复插入 std::cout myset容器中的内容为:; for (it myset.begin(); it ! myset.end(); it) { std::cout *it; } std::cout \n; return 0; }

相关文章:

《C++进阶之STL》【set/map 使用介绍】

关联容器的核心特征是: 非线性逻辑结构:通常基于树(如:红黑树)或哈希表实现,元素间通过键值的有序性或哈希映射建立关联 例如:二叉搜索树中左子树元素键值始终小于根节点,右子树元素…...

AI幻觉!掌握RAG技术,让你的AI回答不再“一本正经地胡说八道”!

这份教程系统地介绍了****生成式 AI 的运行机制及其核心缺陷,即由于概率预测本质而产生的幻觉问题。 为了克服 AI 缺乏实时事实依据的顽疾,深入阐述了 RAG(检索增强生成) 技术,详细梳理了从数据切片、向量化存储到检索…...

数据库高可用

数据库高可用:企业数据安全的生命线 在数字化时代,数据库作为企业核心数据的存储与管理中枢,其稳定性直接关系到业务连续性。一次数据库宕机可能导致数百万损失,甚至引发品牌信任危机。数据库高可用(High Availabilit…...

网络安全应急响应

网络安全应急响应:守护数字世界的安全防线 在数字化时代,网络安全威胁日益复杂,从数据泄露到勒索软件攻击,企业和个人都面临着前所未有的风险。网络安全应急响应(Incident Response, IR)作为应对这些威胁的…...

weixin238基于微信小程序的校园二手交易平台ssm(文档+源码)_kaic

第5章 系统实现进入到这个环节,也就可以及时检查出前面设计的需求是否可靠了。一个设计良好的方案在运用于系统实现中,是会帮助系统编制人员节省时间,并提升开发效率的。所以在系统的编程阶段,也就是系统实现阶段,对于…...

weixin237基于微信小程序的医院挂号预约系统ssm(文档+源码)_kaic

5 系统实现 系统实现部分就是将系统分析,系统设计部分的内容通过编码进行功能实现,以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析,系统设计最主要还是进行功能,系统操作逻辑的设计,也包括…...

Java的密封类与模式匹配在有限继承体系中的类型安全设计

Java的密封类与模式匹配在有限继承体系中的类型安全设计 随着软件系统复杂度提升,类型安全成为现代Java开发的核心诉求。Java 16正式引入的密封类(Sealed Class)与模式匹配(Pattern Matching)特性,为构建有…...

Python的__complex__标准库

Python的__complex__标准库:解锁复数的编程魅力 在科学计算、信号处理或工程模拟中,复数运算常是不可或缺的一环。Python通过内置的complex类型和__complex__方法,为开发者提供了简洁而强大的复数处理能力。这一机制不仅支持基础的复数运算&…...

Spring Boot 自动装配加载逻辑

Spring Boot自动装配机制揭秘:简化开发的魔法引擎 在传统Spring应用中,开发者需要手动配置大量XML或Java Config来管理组件依赖,而Spring Boot通过自动装配(Auto-Configuration)彻底改变了这一局面。其核心思想是“约…...

3月18日(进阶9)

进阶9.矩形乘法 题目描述 给定一个N阶矩阵A&#xff0c;输出A的M次幂&#xff08;M是非负整数&#xff09;例如&#xff1a;A 1 23 4A的2次幂7 1015 22 代码 #include <iostream> #include <vector>using namespace std;// 定义矩阵类型&#xff0c;使用 long long…...

复杂三维山地环境下小龙虾优化算法COA求解多无人机动态避障路径规划研究附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

Redis Cluster 高可用架构设计

Redis Cluster高可用架构设计解析 Redis作为高性能的内存数据库&#xff0c;其集群模式&#xff08;Redis Cluster&#xff09;通过分布式架构实现了数据分片与高可用性&#xff0c;成为企业级应用的热门选择。本文将深入探讨Redis Cluster的高可用设计&#xff0c;从核心机制…...

『NAS』在群晖部署无广聚合搜索引擎-SearXNG

点赞 关注 收藏 学会了 &#x1f4a1;整理了 NAS 专属玩法专栏&#xff0c;感兴趣的工友戳这里关注 &#x1f449; 《NAS邪修》 SearXNG 是一款开源的聚合搜索引擎工具&#xff0c;支持私有化部署&#xff0c;能整合多个主流搜索引擎的结果&#xff0c;且搜索页面无广告、无…...

RV1126 imx335 sensor调试

根据media-ctl -p -d /dev/media0输出&#xff1a;[rootATK-DLRV1126:/]# ls -l /tmp/test.nv12 -rw-r--r-- 1 root root 0 Jan 1 08:00 /tmp/test.nv12 [rootATK-DLRV1126:/]# media-ctl -p -d /dev/media0 Media controller API version 4.19.111 ​ Media device informati…...

【OpenClaw 全面解析:从零到精通】第 001 篇:一只“龙虾“如何改变了 AI 世界——OpenClaw 的诞生与历史背景

系列说明&#xff1a;本系列共计约 20 篇&#xff0c;全面介绍 OpenClaw 开源 AI 智能体框架&#xff0c;从历史背景到核心原理&#xff0c;从安装部署到应用生态。本文为系列第 001 篇&#xff0c;聚焦于 OpenClaw 的诞生历程与时代背景。 摘要 OpenClaw 是 2025 年底由奥地利…...

Python 3.13性能提升揭秘

该提问与当前博客内容无直接关联。 关于Python 3.13版本解决的问题&#xff0c;需要从Python语言本身的演进维度进行技术解析。Python 3.13作为2024年发布的重要版本&#xff0c;主要在解释器性能、语法特性和标准库三个方面进行了系统性优化。 解释器性能优化 自适应解释器…...

24:执行链完整闭环:从目标锁定到确认的全流程状态机

作者&#xff1a; HOS(安全风信子) 日期&#xff1a; 2026-03-07 主要来源平台&#xff1a; GitHub 摘要&#xff1a; 本文深入探讨如何构建一个从目标锁定到确认的全流程状态机&#xff0c;实现执行链的完整闭环。通过状态机的设计模式&#xff0c;我们可以将复杂的执行流程分…...

计算机进制转换

计算机进制转换一. 进制转换1.1 练习二. 原码、反码、补码、偏移码三. 练习一. 进制转换 二进制&#xff1a;逢二进一 十进制二进制001121031141005101611071118100091001101010 十进制转二进制 二进制转十进制 1.1 练习 十进制数转二进制&#xff1a;25 25 → 结果&#…...

无人机数据集汇总无人机航拍各个方面检测分割数据集合集

本数据集集合了面向无人机视觉任务的大规模、多场景、多目标标注数据资源&#xff0c;涵盖了地理环境、智慧城市、基础设施巡检、农业生产、公共安全与灾害监测等多个关键领域。数据主要以两种主流格式提供&#xff1a;适用于目标检测的VOC/YOLO格式与适用于像素级语义分割的La…...

三相风光储LCL并网直流微电网仿真系统探究

三相风光储LCL并网风光储三相并网直流微电网 仿真系统构成&#xff1a; 光伏发电系统、风力发电系统、储能系统、负载、逆变器lcl大电网 附参考文献。 有逆变器控制参数&#xff0c;lcl参数计算m文件提供参考。 1、光伏系统采用扰动观察法实现mppt控制&#xff0c;经过boost电路…...

Q13UDVCPU三菱通用高速型 CPU

Q13UDVCPU 是三菱电机 MELSEC-Q 系列的 通用高速型 CPU&#xff0c;属于 QnUDVCPU 系列&#xff0c;主打超高速运算、大容量 I/O、标准以太网 / USB 接口&#xff0c;为中大型自动化系统提供高性能逻辑控制与数据处理能力。一、产品特性超高速处理&#xff1a;基本指令&#xf…...

从 “幕后配角” 到 “核心担当”,储能正在悄悄改写企业用电账本

当工厂机器轰鸣的用电需求节节攀升&#xff0c;当风、光等新能源发电占比越来越高&#xff0c;电力系统的供需 “错位” 难题正变得越来越棘手&#xff0c;储能的价值也终于从幕后走到聚光灯下。它绝非简单的 “大型充电宝”&#xff0c;而是支撑电力系统稳定运行、帮能源产业降…...

网络:8.网络层

网络层 在复杂的网络环境中确定一个合适的路径. 一.IP协议二.基本概念 主机: 配有IP地址, 也要进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称; 三.协议头格式4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.4位头部长度…...

archery-在rockylinux8上用docker部署sql审计平台

1.安装docker [rootarchery ~]# rpm -qa | grep podman [rootarchery ~]# rpm -q podman package podman is not installed [rootarchery ~]# dnf install -y yum-utils device-mapper-persistent-data lvm2 [rootarchery ~]# yum-config-manager --add-repo https://downloa…...

AI 数学的秘密花园:番外A.Prompt工程的几何直觉(用语义泡泡写prompt,效果翻倍)

番外A:Prompt工程的几何直觉(用语义泡泡写prompt,效果翻倍) 四大部分咱们已经从向量小积木,一路逛到大模型的生成魔法乐园,是不是觉得AI的“脑子”终于从黑箱变成了会呼吸的秘密花园?现在进入番外篇啦~第一站就是最实用的“落地神技”:Prompt工程的几何直觉。简单说,…...

量化交易入门

对于新手而言&#xff0c;量化交易无需被复杂代码和公式吓退&#xff0c;它本质是“数据驱动纪律执行”的投资方式&#xff0c;用计算机程序替代人工主观判断&#xff0c;实现更高效、更理性的交易。 一、什么是量化交易&#xff1f; 简单来说&#xff0c;就是把你对市场的判断…...

OpenAI Codex CLI 通过 LiteLLM 代理接入指南

统一代理调用 | 最佳配置 | 多模型切换 | 团队共享 概述 OpenAI Codex CLI 是一个终端 AI 编程助手,支持代码生成、重构、调试等。默认连接 OpenAI 官方 API,但可以配置为通过 LiteLLM 代理调用,统一走公司的 AI 代理平台,享受多厂商模型、预算控制、用量统计等能力。 安…...

AI写论文有妙招!4款AI论文生成工具,解决毕业论文写作难题!

您是否正在为撰写期刊论文、毕业论文或者职称论文而感到烦恼呢&#xff1f; 在进行人工撰写时&#xff0c;面临数不胜数的文献就像在汪洋大海中寻找一根针&#xff0c;复杂的格式要求让人倍感压力&#xff0c;反复的修改常常磨灭了写作的热情&#xff0c;低效率也成了许多学术…...

为何抗体定制服务是解决特定研究需求的关键策略?

一、抗体在生物医学研究与转化应用中的核心作用是什么&#xff1f;抗体&#xff0c;作为免疫系统响应特定抗原刺激而产生的高度特异性糖蛋白&#xff0c;是生命科学研究和生物医药开发中不可或缺的核心工具。凭借其精准的识别与结合能力&#xff0c;抗体被广泛应用于蛋白质组学…...

【C++进阶】彻底搞懂智能指针:从 RAII 原理到 unique_ptr/shared_ptr/weak_ptr 最佳实践

前言在 C11 之前&#xff0c;new 和 delete 是每位 C 程序员的噩梦。忘记释放内存导致泄漏、异常抛出导致 delete 未执行、多人协作时所有权不明确……这些问题催生了 C11 中最伟大的特性之一&#xff1a;智能指针&#xff08;Smart Pointers&#xff09;。本文将基于 <memo…...