set和map对象为自定义类型时需注意的问题

在STL的map或set容器中使用类作为key 在STL的map或set容器中,当使用类作为key时,需要的类结构 立即下载

set和map不可以对自定义的数据类型自动排序,但是可以对pair自动排序,默认优先按照first排序,first相等则按照second排序

pair对象

set:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    set<pair<int, int>> s;
    s.insert({1, 2});
    s.insert({3, 4});
    s.insert({1, 1});
    for(auto k : s) cout << k.first << " " << k.second << endl;
    return 0;
}

在这里插入图片描述
map针对其键排序与set同理

#include <bits/stdc++.h>
using namespace std;
int main()
{
    map<pair<int, int>, int> s;
    s[{1, 2}] = 1;
    s[{3, 4}] = 1;
    s[{1, 1}] = 0;
    for(auto k : s) printf("%d %d %d\n", k.first.first, k.first.second, k.second);
    return 0;
}

在这里插入图片描述
而若想对自定义的数据类型排序,需要重载"<"运算符

自定义数据类型

set:

#include <bits/stdc++.h>
using namespace std;
struct stu
{
    int i, j;
    bool operator<(const stu & b)const // 类内重载,所以少一个参数,优先按照i从大到小排序,j从大到小次之
    {
        return i == b.i ? (j > b.j) : (i > b.i);
    }
};
int main()
{
    set<stu> s;
    s.insert({1, 2});
    s.insert({3, 4});
    s.insert({1, 1});
    for(auto k : s) printf("%d %d\n", k.i, k.j);
    return 0;
}

在这里插入图片描述
map:

#include <bits/stdc++.h>
using namespace std;
struct stu
{
int i, j;
bool operator<(const stu & b)const // 类内重载,所以少一个参数,优先按照i从大到小排序,j从大到小次之  
    {return i == b.i ? (j > b.j) : (i > b.i);}
};

int main()
{
    map<stu, int>s;
    s[{1, 2}] = 1;
    s[{3, 4}] = 1;
    s[{1, 1}] = 0;
    for(auto k : s) printf("%d %d %d\n", k.first.i, k.first.j, k.second);
    return 0;
}

也可以选择手动传入比较函数对象
set:

#include <bits/stdc++.h>
using namespace std;
struct stu
{
    int i, j;
};
struct cmp
{
    bool operator()(const stu &a, const stu & b)const // 重载()
    {
        return a.i == b.i ? (a.j > b.j) : (a.i > b.i);
    }
};
int main()
{
    set<stu, cmp> s; // 第二个参数默认是_Compare对象,默认std :: less,将其修改为我们定义的
    s.insert({1, 2});
    s.insert({3, 4});
    s.insert({1, 1});
    for(auto k : s) printf("%d %d\n", k.i, k.j);
    return 0;
}

在这里插入图片描述
map:

#include <bits/stdc++.h>
using namespace std;
struct stu
{
    int i, j;
};
struct cmp
{
    bool operator()(const stu &a, const stu & b)const // 重载()
    {
        return a.i == b.i ? (a.j > b.j) : (a.i > b.i);
    }
};
int main()
{
    map<stu, int, cmp> m; // 第三个参数默认是_Compare对象,默认std :: less,将其修改为我们定义的
    m[{1, 2}] = 1;
    m[{3, 4}] = 2;
    m[{1, 1}] = 3;;
    for(auto k : m) printf("%d %d %d\n", k.first.i, k.first.j, k.second);
    return 0;
}

在这里插入图片描述

有时,需要对map按value值进行排序,此时往往转换为vector
#include <bits/stdc++.h>
using namespace std;
int main()
{
    map<int, int> s;
    s[1] = 4;
    s[2] = 3;
    s[3] = 1;
    vector<pair<int, int>> S;
    for (auto i : s) S.push_back(i);
    // 将value从大到小排序,lambda表达式
    sort(S.begin(), S.end(), [&](pair<int, int>& a, pair<int, int>& b) { return a.second < b.second;});
    for(auto k : s) printf("%d %d\n", k.first, k.second);
    return 0;
}

在这里插入图片描述
另外,set和map底层是基于红黑树的,而unordered_set和unordered_map,都是基于哈希的,因此unordered_set和unordered_map定义时的对象如果是非基本数据类型,要自定义包含哈希函数的对象,处理冲突用的是链地址法

注意,和set和map不同,unordered_set和unordered_map对于pair类型也要自定义哈希对象

可以参考 https://blog.youkuaiyun.com/vevenlcf/article/details/51743058)

set:

#include <bits/stdc++.h>
using namespace std;

class s_hash
{
    public:
        // 定义为inline提高速度
        inline size_t operator()(const pair<int, int> &p)const 
        {
            return p.first^ p.second;  
            // 哈希函数的设计,链地址法处理冲突
        }   
};

int main()
{
    unordered_set<pair<int, int>, s_hash> s;
    s.insert({1, 2});
    s.insert({3, 4});
    s.insert({1, 1});
    for(auto k : s) cout << k.first << " " << k.second << endl;
    return 0;
}

在这里插入图片描述
map:

#include <bits/stdc++.h>
using namespace std;

class s_hash
{
    public:
        // 定义为inline提高速度
        inline size_t operator()(const pair<int, int> &p)const 
        {
            return p.first^ p.second;  
            // 哈希函数的设计
        }   
};

int main()
{
    unordered_map<pair<int, int>, int, s_hash> m;
    m[{1, 2}] = 1;
    m[{1, 1}] = 2;
    m[{3, 4}] = 3;
    for(auto k : m) printf("%d %d %d\n", k.first.first, k.first.second, k.second);
    return 0;
}

在这里插入图片描述

Verilog除法器(32位无符号+带符号) 32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从“部分余数”中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a reg_b 存放除数b reg_r 存放余数(初始清零) 具体做法: 做减法时,减数是reg_b中的除数,被减数是reg_r中的余数左移一位,最低位由reg_q(被除数)的最高位补充。为了能够判断相减结果的正... 阅读详情

相关推荐

BH1750光强度传感器Stm32f103驱动(已测试ok)

1. 实验:Stm32f103 驱动 bh1750采集光照强度,串口打印采集到的数据。 2. 实验准备器材 开发版:stm32f103c8t6 器件:bh1750 GY-302 开发环境:win10,KILE4 下载程序的软件:FlyMcu.exe 串口调试助手:ComAssistant.exe 3. BH1750 的接线 VCC:5V或3.3V ...

weixin_53329977的博客 8930

Set接口注意事项

1、Set的接口对象,可以存放一个null、不能存放重复的元素 2、set接口对象存放数据是无序的,即添加和取出的顺序是不一样的 3、取出的顺序虽然不是添加的顺序,但是他是固定的

youngerxsd的博客 238

Codex CLI 接入智谱 GLM-5.1 完整教程

Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。

u011831527的博客 2574

set中放入结构体或者自定义对象注意的问题

老习惯,还是先上代码 class Pos { public: Pos(int x, int y) : _x(x), _y(y){} bool operator<(const Pos & another)const { return (_x > another._x || _x == another._x && _y > another._y); } void showPos()const { cout << "(" &lt

qq_36065506的博客 1277

【数字IC设计】Centos 7桌面版 安装Synopsys EDA Tools

简称DC,是Synopsys公司用于做电路综合的核心工具,可以将HDL描述的电路转换为基于工艺库的门级网表。

qiumingT的博客 9803

Open5GS实战:从零搭建树莓派5G核心网并与商用终端联调

本文详细介绍了如何在树莓派5上从零开始搭建基于Open5GS的5G核心网,涵盖系统准备、依赖安装、源码编译、关键配置修改及服务启动全流程。通过整合SDR基站与商用终端进行端到端联调,为开发者和研究者提供了一个低成本、可实践的5G网络实验平台,助力物联网与边缘计算应用的本地化测试与验证。

weixin_29194255的博客 161

set初始化之自定义类型元素

//报错,因为模板的第二个默认参数是std::less<Key>类,它只能对内置类型进行<比较,无法识别自定义类型的<操作 set<Point> number = { Point(1, 2),Point(-2, 3) }; 3种解决方法: 1、重载针对于Point类的operator<() bool operator<(const Point &lhs, const Point &rhs) { cout <&lt...

qq_43496435的博客 292

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)算法背景介绍Hessian 矩阵与泰勒多项式关于求t导数与中心点、亚像素点高斯函数作用文献 算法背景介绍 在线结构光视觉传感器中,由线激光器发射出的线结构光,在本质上为一个连续且具有一定厚度的空间光平面,而在目标表面上所形成的具有一定宽度的光条特征,即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上,光强近似服从高斯分布,因而在摄像机采集到的光条图像中,在沿着光条宽度的方向或光条的法线方向上,其灰度也会呈现出类似

jiangxing11的博客 1万+

Map以自定义类做为键值

map在STL中的定义template , class Alloc = alloc> 第一个参数Key是关键字类型第二个参数T是值类型第三个参数Compare是比较函数(仿函数)第四个参数是内存配置对象map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。所以作为关键字,起码必须有“在选择map的关键字时,注意以下两点,同时这两点也是改错的方法:a) 关键字明确定义“b) 没有“

Seanyxie Blog 1万+

具身智能(26):RDK S100的LeRobot或Agile X piper机械臂控制模型

本文档详细介绍了基于ROS2的机器人控制模型架构与标定数据联动机制。核心采用"感知-规划-控制"闭环流程,通过激光雷达、相机和IMU的融合数据实现厘米级定位(≤1cm)。文档包含两大控制模型配置:1)RDKLeRobot模型,重点说明PID参数调节和标定文件路径设置;2)AgileXPiper模型,强调驱动安装与外部标定文件集成。针对常见问题提供解决方案,如控制指令无响应需验证标定路径,运动偏差过大需重新标定等。最后给出批量部署方案,通过复制基准配置文件实现多机器人快速配置,要求定位偏差

码农17年的博客 179

使用verilog设计实现QR分解

QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。 使用verilog对QR实现方法进行设计并进行功能仿真: 如下: 顶层模块代码: module TOP( H1R, H1I, H2R, H2I, H3R, H3I, H4R, H4I, clk, rst_n, Y1R, Y1I, Y2R, Y2I, X1R, X1I, X2R, X2I ); parameter width = 16; // I

QQ_778132974的博客 2150

C++ STL set和map容器插入自定义数据

自定义的数据类型需要指定排序的方式,才可以使用set容器。 重载 () 的方式 需要额外定义一个类,类中重载()来指定排序的方式,Compare中指定了排序为从大到小的排序。 #include <iostream> #include <set> using namespace std; class MyData { public: int value; MyData(int value) { this->value = value;

哈哈一笑 1522

手把手教你学Simulink——基于Simulink的隔离型DC-DC全桥变换器移相控制建模示例

本文详细介绍了基于Simulink的全桥移相变换器(PSFB)建模与控制方法。首先分析了全桥移相拓扑在大功率应用中的优势,包括ZVS实现、高频化和小型化特点。随后给出了具体设计参数和移相控制策略,采用电压外环+移相角内环的双闭环控制架构。文章重点演示了Simulink建模步骤,包括主电路搭建、移相PWM生成和PI控制器设计,并通过满载稳态、负载阶跃和轻载测试三种场景验证了系统性能。最后总结了工程实践要点,提出自适应控制等扩展方向,强调移相控制通过精准时间管理实现高效能量转换的核心价值。

MHD0815的博客 261

Map 和 Set (Java详细讲解)看我就够了

Map 和 Set 概念: Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的 搜索方式有: 1.直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢 2.二分查找,时间复杂度为,但搜索前必须要求序列是有序的 上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如: 1.根据姓名查询考试成绩 2.通讯录,即根据姓名查询联系方式 3.不重复集合,即需...

qq_46116963的博客 5425

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Set 和 Map 的使用

1,Set 的特点:不重复性,(里面的数据没有重复的值).:元素的遍历顺序 = 元素的添加顺序.:Set 是「值的集合」,不像对象有「键值对」结构,遍历直接获取元素本身.

W2004828的博客 1011

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

对stl的set中元素进行删除时需注意的地方

使用迭代器,循环删除stl中vector、map、set等需要注意的问题: 会出现map/set iterator not incrementable 主要是因为erase(iterator)后,迭代器已经发生变化了。 在vector和map中,还可以返回下一个迭代器,所以可以用: iterator = erase(iterator); 而在set中没法返回迭代器,所

chendejiao的专栏 744

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C++】map和set的使用

本文系统介绍了C++中的关联容器,包括set、multiset、map和multimap。它们通过键值特性进行高效查找和操作,分为有序(基于红黑树)和无序(基于哈希表)两类。set存储唯一有序元素,multiset允许重复;map存储唯一键值对,multimap允许键重复。详细讲解了各容器的基本操作:插入(insert)、删除(erase)、查找(find/count)和边界查找(lower_bound/upper_bound),特别强调set元素的不可修改性和map的[]操作符特性。最后指出multima

2302_81312180的博客 1114

List、Set、Map 的 of() 方法

JDK9在 List、Set、Map 等,都提供了 of() 方法,表面上看来,它们似乎只是建立 List、Set、Map 实例的便捷方法,例如: List<String> nameLt = List.of("Justin", "Monica"); nameLt ==> [Justin, Monica] Set<String> nameSet = Set.o...

DaiSucan的博客 3652

Java -- Map与Set

Set与Map介绍

qq_55916894的博客 910

C++ unordered_map/set

当使用自定义类型(如结构体)作为的 key 时,需要手动实现哈希仿函数和相等仿函数// 自定义类型int age;// 重载==:满足相等比较要求// 实现哈希仿函数:将Person转为整形// 组合哈希:将string和int的哈希值结合,减少冲突// 定义unordered_set,传入自定义哈希仿函数// 插入自定义类型和是 C++ 中高效的无序关联式容器,与map/set追求极致的增删查效率,且无需有序遍历 → 选 unordered_map/set;

Zengwengang的博客 413

【C++】map与set的封装实现

set和map的封装模拟实现

m0_74246469的博客 788

map、set模拟(底层封装红黑树)

红黑树代码,map类结构,set类结构,红黑树迭代器,map、set迭代器,map的operator[]重载,整体代码,需要注意的点和容易犯错的点

m0_74824254的博客 939

数组和链表的区别以及List、Set和Map的区别

1、研究数组和链表的区别并做相应的记录: https://blog.youkuaiyun.com/u010843114/article/details/52207035

CommunicationJava的博客 438

Java 集合框架:List、Set 和 Map——从原理到实战的深度解析

Java集合框架提供了丰富的接口与实现类,没有“最好”的集合,只有“最适合”的集合。数据特性:是否需要重复、是否需要顺序、是否需要键值映射;操作类型:高频查询(选数组结构)、高频增删(选链表结构)、需要排序(选树结构);性能要求:哈希表(O(1))通常比树结构(O(log n))更快,但树结构支持有序操作。掌握这些原则,你就能在实际开发中“对症下药”,用集合框架高效解决数据存储与操作问题。

yue_yun_的博客 1313

对象扩展、函数的扩展、Symbol、Iterator 迭代器、Set结构、Map 数据结构——ES6+

对象扩展、函数的扩展、Symbol、Iterator 迭代器、Set结构、Map 数据结构——ES6+

weixin_70320000的博客 372

Java中的List、Set和Map之间有什么区别?其中历史由来、工作原理、使用场景、注意事项

因此,在Java 2版本中,Sun公司引入了集合框架,为Java程序员提供了更加灵活和高效的数据结构和算法,从而改进了Java的编程特性。对于Set的操作,Java提供了基本的增删查方法,例如:add()、remove()、contains()等。对于需要快速查找元素的场景,可以选择HashMap;对于List的操作,Java提供了基本的增删改查方法,例如:add()、remove()、get()等。对于Map的操作,Java提供了基本的增删改查方法,例如:put()、remove()、get()等。

ljh_23333的博客 766
上一篇: 695 岛屿的最大面积
下一篇: 874 模拟行走机器人
UnendingGlory
博客等级 码龄9年 55粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值