提问人:Maryam Shabani 提问时间:11/2/2023 最后编辑:Mark RotteveelMaryam Shabani 更新时间:11/10/2023 访问量:73
自定义比较,用于设置实际键属于 [duplicate] 的类的访问成员变量
Custom comparison for set accessing member variables of a class where the actual keys belong to [duplicate]
问:
如何为以下示例指定自定义比较?这个想法是访问类中的成员变量进行比较。
struct MyStruct {
unsigned p;
unsigned t;
};
class MyClass {
public:
void call() {
ob["o1_10"] ={10, 1};
mbp[ob["o1_10"].p].insert("o1_10");
ob["o2_20_2"] ={20, 2};
mbp[ob["o2_20"].p].insert("o2_20");
ob["o4_4_4"] ={4, 4};
mbp[ob["o4_4"].p].insert("o4_4");
ob["o5_10"] ={10, 4};
mbp[ob["o5_10"].p].insert("o5_10");
}
private:
map<unsigned,set<string, Compare>> mbp;
// Question: how to define compare using struct, operator(), statice metthod or external method so that
// compare fetches ob[ol] and ob[0l2] and decide based on some rules
// so, comparions is not based on ol and o2 and it is based on some p and t in ob[o1] and ob[02]
// Eg:
// bool compare(const string& o1, const string& o2) const {
// if (ob.at(o1).p > ob.at(o2).p) return true;
// if (ob.at(o1).p == ob.at(o2).p && ob.at(o1).t < ob.at(o2).t) return true;
// return false;
// }
map<string, MyStruct> ob;
};
int main() {
MyClass my_class;
my_class.call();
return 0;
}
请务必注意,比较键不是类的实例。相反,我想使用密钥来访问要比较的类的实例。如果可以做到这一点,我可以节省一些内存。
我尝试了以下方法,每个方法都给我带来了不同的错误:
- 类内结构
- 函
- 使用 bind
答:
0赞
Pepijn Kramer
11/2/2023
#1
你需要像这样超载。operator<
使用此运算符,您可以在 in 和 (as key) 中使用您的类。在实践中,您可能还希望重载所有比较运算符(对于 C++20,改为重载飞船运算符)。std::set
std::map
#include <map>
#include <set>
#include <iostream>
class my_class_t
{
public:
my_class_t(int x, int y) :
m_x{x},
m_y{y}
{
}
friend bool operator<(const my_class_t& lhs, const my_class_t& rhs);
private:
int m_x;
int m_y;
};
bool operator<(const my_class_t& lhs, const my_class_t& rhs)
{
if (lhs.m_x == rhs.m_x)
{
return lhs.m_y < rhs.m_y;
}
return lhs.m_x < rhs.m_x;
}
int main()
{
std::set<my_class_t> set{{1,1},{2,1},{2,2}};
std::map<my_class_t,int> map{{{1,1},1}, {{1,2},2}};
int value = map[{1,2}];
std::cout << value;
return value;
}
评论
1赞
Pepijn Kramer
11/2/2023
我认为你在这里基本上是碰壁了。std::set 将需要一个在编译时定义的函数。你所要求的相当于在运行时设置一个比较函数(不同的实例取决于你的类的实例)。所以这是不可能的。
1赞
Pepijn Kramer
11/2/2023
那么你想实现什么,看来这个设计是行不通的。
0赞
Maryam Shabani
11/2/2023
这并不能回答我试图强调的用例。在 MyClass 实例之间不会进行比较。它位于字符串之间。我需要访问我的类中的成员变量。请注意,stackoverflow.com/questions/69639021/...提供的解决方案也不起作用。请参阅帖子以获取我的评论。
1赞
Pepijn Kramer
11/2/2023
我有点理解你的意图。我告诉你这不是 std::set 和 compare 函数的工作方式。比较函数必须在编译时是已知的,并且不能在运行时修改才能访问其中一个类实例。
0赞
Maryam Shabani
11/10/2023
你问了一个非常重要的问题(即,你想实现什么)。我想为我的数据上运行的不同任务/操作(即 MyStruct 实例的集合)实现最佳运行时。类似于 leetcode.com/problems/max-stack 的东西。因此,我有两张地图。在这里,我提供了一个简单的 MyStruct 来突出我的观点,但我的实际结构更重。我想我有点交叉引用的东西,这样我就不必在两个映射中保留 MyStruct 实例。
评论