mr_*_*r_T 1 c++ sorting dictionary key operator-overloading
我想知道如何std::less使用没有特定operator <关联键的地图在地图中工作.
更具体地说,我正在使用两个库,每个库在3D空间中都有自己特定的点实现:
class Lib1Point
{
public:
double x;
double y;
double z;
// ctors, dtor and lots of fancy methods, but no further data members
};
class Lib2Point
{
private:
double coords[3];
public:
// lots of other fancy methods, but also no further data members
};
Run Code Online (Sandbox Code Playgroud)
两个类都没有operator <定义.
class SomeData;
std::map<Lib1Point, SomeData> m_pointData1;
std::map<Lib2Point, SomeData> m_pointData2;
Run Code Online (Sandbox Code Playgroud)
这两个地图如何对其键进行排序?点数会按相同的顺序排序吗?我可以以某种方式信任此订单,还是特定于编译器?如果我不相信它,那么在没有访问点类源代码的情况下强制执行特定订单的最简单方法是什么?
尝试将元素插入容器时,将出现编译器错误.
int main()
{
std::map<Lib1Point, SomeData> m_pointData1;
std::map<Lib2Point, SomeData> m_pointData2;
m_pointData1.insert({Lib1Point{}, 1});
}
Run Code Online (Sandbox Code Playgroud)
实例.
这给出了错误
错误:二进制表达式的操作数无效('const Lib1Point'和'const Lib1Point')
Run Code Online (Sandbox Code Playgroud){ return __x < __y; } ~~~ ^ ~~~
您可以operator<为您的类型定义一个,或者编写一个自定义函数对象my_less并将其作为第三个模板参数传递给std::map
#include <tuple>
struct Lib1Less {
bool operator()(Lib1Point const& L, Lib1Point const& R) {
return
std::forward_as_tuple(L.x, L.y, L.z) <
std::forward_as_tuple(R.x, R.y, R.z)
;
}
};
int main()
{
std::map<Lib1Point, SomeData, Lib1Less> m_pointData1;
m_pointData1.insert({Lib1Point{1,2,3}, 1});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |