C++如何在set中插入struct

C++ set插入与删除操作避坑指南:红黑树迭代器失效与安全实践 在C++标准库中,容器是管理数据集合的基础组件,其中关联容器如std::set因其自动排序和元素唯一性,在需要有序去重的场景中广泛应用。其底层通常基于红黑树实现,这种自平衡二叉搜索树保证了O(log n)时间复杂度的查找、插入和删除操作。理解其原理对于编写正确高效的代码至关重要,尤其是迭代器失效规则:插入操作不会使任何现有迭代器失效,而删除操作仅使指向被删除元素的迭代器失效。这一特性直接关系到程序的内存安全与稳定性,是避免未定义行为和隐蔽Bug的核心。在工程实践中,安全地循环删除元素、高效利用范围删除以及结 阅读详情

上周写了一个C++程序,编译不过,而且VS2010也没为我指出出错的代码是具体的哪一行,于是我用了二分查找分,最后定位发现,set<struct Point2D>的对象在使用insert函数时出错了。

我突然想起set的内部实现是红黑树,它会按照一定的准测排序元素,而且set保证无重复元素。

以往都是使用set作基本类型的容器,排序准测是默认的,但是struct不是基本类型,所以必须要手写一个struct的比较准则。


代码如下,我根据Point2D的x y 点的大小排序:

struct Point2D
{
	double x;
	double y;

	friend bool operator < (struct Point2D const &a,struct Point2D const &b)
	{
		if (a.x == b.x)
		{
			return a.y < b.y;
		}
		else
		{
			return a.x < b.x;
		}		
	}
};

如果在set中插入自定义的class,方法也是一样的。
C++ set容器详解:从红黑树原理到高效初始化与实战应用 在C++标准库中,关联容器是实现高效数据检索的关键组件,其核心设计基于特定的数据结构以优化查找性能。红黑树作为一种自平衡二叉搜索树,通过严格的着色与旋转规则,确保了在最坏情况下对数级的时间复杂度,为动态数据集合提供了稳定的排序与唯一性保障。这一特性使得基于红黑树实现的容器在需要维护有序唯一数据的场景中具有重要技术价值,例如在数据库索引、实时排行榜或需要快速去重排序的算法中。C++的set容器正是这一原理的典型应用,它通过多种初始化方法(如列表初始化、迭代器范围初始化)和自定义比较器,为开发者提供了灵活的数据 阅读详情

相关推荐

hash_set c++总结(自定义类型struct、class)

hash_set c++总结(自定义类型stuct、class)。总结自定义struct、class三个案例。find函数测试,hash_set迭代器。

C++ set插入结构体struct数据类型

set具有天然的排序与去重功能,结构体不是基本类型(基本类型有默认的排序准则),因此需要重载 < 运算符。(相当于给自定义类型一个排序准则)。bool operator <(const HolePos & a)const ;运算符重载必须是const。 #include "stdafx.h" #include <set> #include <iostre...

丰空岛主(Vega Prime,Android,LabWindows,ThreeJS,Python,OpenCV) 8342

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

不忘初心 方得始终 2979

C++set集合如何插入结构体struct【no match for ‘operator<‘(operand types are ‘const Node‘ and‘const Node‘)】

在写算法时,经常会用到vector容器和自定义结构体struct,用vector容器保存struct结构体时,都不会出现啥问题(试了map也没问题) #include <bits/stdc++.h> using namespace std; struct Node{ int x,y; Node(){} Node(int _x,int _y):x(_x),y(_y){} }; vector<Node> v; map<int,Node> m; int main() .

qq_46470984的博客 1994

前沿数据解析 | 麻省理工-斯坦福-丰田研究中心电池数据集:AI驱动下的电池寿命早期预测

本文解析了麻省理工、斯坦福与丰田研究中心联合发布的电池数据集,展示了AI驱动下的电池寿命早期预测技术。通过分析124个商用锂离子电池的完整生命周期数据,研究团队仅用前100次循环数据即可准确预测电池报废时间,为电动汽车电池管理提供革命性解决方案。数据集包含LFP/石墨体系电池的详细测试记录,结合差分容量分析和梯度提升树模型,预测精度显著提升。

weixin_26950847的博客 529

Star CCM+ 实战:旋风分离器网格加密策略与湍流模拟优化

本文针对Star CCM+中旋风分离器模拟精度不足的常见问题,深入剖析了网格质量的关键影响。文章重点介绍了通过局部网格加密策略,精准优化旋流核心区与入口区域的网格密度,从而在保证计算效率的前提下,显著提升湍流模拟的准确性与流场细节的捕捉能力,为工程实践提供了一套有效的优化方案。

water的专栏 534

C++ 在set中插入struct Gym - 101510A Art

set需要自定义struct的排序方式 例如,定义一个struct如下: struct tri { int x, y, z; friend bool operator < (const tri &a, const tri &b) { if (a.x == b.x) { if (a.y == b.y) return a.z < b.z; e...

Patience 680

Sonatype nexus3 数据迁移及升级3.71+(迁移到H2数据库)

nexus3旧版本OrientDB升级H2,及整体迁移nexus3数据到其它服务器。

葫芦娃 5550

C++ set容器

c++,STL中的set容器

不要当真! 893

揭秘 C++ 性能优化的终极秘籍,让你面试时应答如流

VTune Amplifier 是英特尔开发的一款强大的性能分析工具,它可以深入分析应用程序在英特尔架构上的性能瓶颈。功能特点全面的分析视角:提供了多种分析模式,如热点分析、线程分析、内存分析等。热点分析模式能快速定位程序中最耗时的代码段;线程分析模式可帮助开发者了解多线程程序中线程的执行情况、同步开销等;内存分析模式则专注于内存访问的性能,包括缓存命中率、内存带宽使用等。硬件层面的洞察:能够深入到硬件层面,分析 CPU 的微架构指标,如指令级并行度、流水线停顿等。

大模型大数据攻城狮的专栏 1149

【纯实战】C#基于TCP/IP实现三菱PLC MC协议完整通信(含完整源码+通信原理+避坑指南)

MC协议是三菱电机为旗下MELSEC系列PLC量身定制的以太网专用通信协议,本质是一套基于TCP/IP的应用层协议规范,专门用于实现上位机(PC/工控机)与PLC之间的双向数据交互,支持对PLC的软元件(X/Y/M/D/W/T/C等)进行读、写、批量读写等核心操作,同时支持PLC状态查询、程序启停等控制指令。重要:三菱PLC的MC协议默认基于TCP 4999端口通信,部分新版本FX5U/Q系列也支持TCP 5000端口,核心通信逻辑一致。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 891

数据结构之insert插入代码

经济学家用一个公式表达复利效应:(1+r)^n,r 代表你正在做的事,n 代表时间,只要 r 为正,即你在做正确的事,时间就会为你带来奇迹。

这里是菠萝味菠萝啤的博客 2274

PCL点云算法与项目实战案例汇总(长期更新)

本专栏将深入探讨PCL(点云库)的基础算法,旨在帮助读者掌握点云处理的核心技术。内容涵盖点云的采样、过滤、配准、分割等基础操作,并结合实际案例,展示这些算法在工程中的应用。无论你是初学者还是有一定经验的开发者,都能通过本专栏加深对PCL的理解,提升在三维数据处理领域的技能。

纵马踏花向自由 3001

再学C++ | std::set 的原理

需要在插入到时候排序,所以需要重载 struct 的比较运算符,这个时候就出现问题了,首先我们定义一个结构体。利用红黑树的特性来实现有序的插入、查找和删除操作,并且具有较好的平均和最坏情况下的时间复杂度。)将新元素插入到红黑树的适当位置,以保持树的有序性质。)使用红黑树的性质,通过比较函数在树中进行二分查找,查找操作的平均时间复杂度为。p1、p2,在 p1

SongXJ的博客 1096

极验点选click3.1.0所对应fullpage.js的逆向分析

极验3代点选验证,本文适用于使用click.3.1.0.js和fullpage919-eyz9lh.js版本的web验证码,没有细节内容,适合有基础的开发者阅读。

shanf7921的博客 647

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

struct重载小于号

struct能重载? 没错,虽然在C里struct里不能定义函数,但在C++中struct除了默认成员为public外,和class几乎没有分别。 那如果要用到重载的,为什么不用class? 不知道。可能是用set的时候犯了一个错误。 等等,这和set有什么关系? set是按关键字从小到大排列的一个算法结构。因此插入到set里的元素需要能够比较大小,不管这个对象的类型是系统默认的还是自定

handongyexue的专栏 1593

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

unordered_set使用介绍

unordered_set C++ 11,新的关联容器:unordered_set 基本介绍 set和map内部实现是基于RB-Tree,而unordered_set和unordered_map内部实现是基于哈希表。 unordered_set 容器类型的模板定义在 <unordered_set> 头文件中。 # include<unordered_set> ...

TamakiRinko的博客 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ 常见问题总结(6)

迭代器是不允许一边读一遍修改的(通过迭代器来遍历容器)当通过迭代器插入一个元素,所有迭代器就都失效了当通过迭代器删除一个元素,当前删除位置到后面所有的元素的迭代器就都失效了当通过迭代器更新容器元素以后,要及时对迭代器进行更新, insert / erase方法都会返回新位置的迭代器。

ljy的博客 364

c++基础2

这次是C++​​​​​​基础2哦 给自己的学习总结帖~~whaosoft aiot http://143ai.com 不过这次都是c++ ​

whaosoft143ai的博客 500

C++STL map和set的底层理解及其模拟实现【保姆式教学】

set文档介绍map的文档简介// 该节点的左孩子 AVLTreeNode < T > * _pRight;// 该节点的右孩子 AVLTreeNode < T > * _pParent;// 该节点的双亲 T _data;int _bf;// 该节点的平衡因子 };// 节点的颜色 enum Color {// 红黑树节点的定义 template < class ValueType > struct RBTreeNode {

qq_54626677的博客 2766

C++ STL set 容器实战:3 种插入与遍历方法,避免情绪脑式编码混乱

本文详细介绍了C++ STL set容器的三种插入与遍历方法,帮助开发者避免情绪化编码混乱。通过insert()、emplace()和初始化列表三种插入方式,以及迭代器、范围for循环和算法库三种遍历方法,展示了如何实现高效、有序的代码结构。文章还对比了有序编码与无序编码的差异,并提供了避免情绪化编码的实践技巧。

cuanku6549的博客 574

C++ STL set容器:高效编程的利器

默认情况下,std::set使用运算符对元素进行升序排序。然而,我们可以通过自定义比较函数来改变排序规则。cpp复制// 降序排序return 0;std::set是一个功能强大且高效的关联式容器,适用于需要自动排序和高效查找的场景。通过自定义比较函数,可以灵活地调整排序规则。同时,提供了对重复元素的支持,进一步扩展了其应用场景。希望本文能帮助你更好地理解和使用std::set。如果你有任何问题或建议,欢迎在评论区留言讨论!

qq_57063846的博客 655

C++ STL set容器详解:从红黑树原理到高效应用实践

在C++标准模板库中,关联容器是实现高效数据管理的重要工具。其底层通常基于平衡二叉搜索树(如红黑树)实现,通过维护元素的有序性,确保插入、删除和查找操作的时间复杂度稳定在O(log n)。这种数据结构在需要动态维护有序唯一集合的场景中具有显著技术价值,例如用户ID管理、交易数据去重和游戏对象排序等。理解其内部机制,包括自定义排序规则和迭代器特性,能够帮助开发者在实际工程中优化性能。本文以C++ STL set容器为例,深入剖析其红黑树实现原理,并结合自定义比较函数和范围查询等进阶用法,展示如何在实际项目中高

weixin_34326179的博客 995

【C++】红黑树模拟实现STL中的map与set

/ 定义红黑颜色RED,BLACKT _data;// 数据域// 用来标记节点颜色RBTreeNode(const T& data) // 构造函数{}定义红黑树结构(KVK:键值 key 的类型。T:数据的类型,如果是 map,则为 pair;如果是 set,则为 K。

Elena's Blog 807
上一篇: 这两个月找实习的经历
下一篇: DataTables的使用
I_code
博客等级 码龄16年 42粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值