我有一个名为Point的类(在外部库中,我无法修改代码),用于表示3d空间中的一个点:
int x = 0; int y = 0; int z = 0;
Point my_point p(x,y,z);
它会使==
和!=
运算符超载,但不会超过<
或>
运算符。我需要以有效的方式存储它们(没有双重元素,没有重复)。我以为我的数据结构是set
,但如果我尝试使用,我会收到此错误:
error: no match for ‘operator<’ in ‘__x < __y’
一些建议?
答案 0 :(得分:5)
编写一个比较运算符,并用{:1>}实例化set
struct ComparePoints
{
bool operator()( Point const& lhs, Point const& rhs ) const
{
if ( lhs.x != rhs.x ) {
return lhs.x < rhs.x;
} else if ( lhs.y != rhs.y ) {
return lhs.y < rhs.y;
} else {
return lhs.z < rhs.z;
}
}
};
std::set <Point, ComparePoints> mySet;
答案 1 :(得分:3)
您可以定义比较仿函数并将其作为第二个模板参数传递给std :: set。请参阅here,查看Compare
。您也可以定义bool operator<(const Point& lhs, const Point& rhs)
,但如果您无法触及该类,则需要通过Point
的公共接口实现比较。
答案 2 :(得分:1)
您可以定义运算符&lt;你自己。如果可以从Point的公共接口获得x,y和z,则它不必在Point类中。
bool operator<(const Point& lhs, const Point& rhs)
{
if( lhs.x != rhs.x ) return lhs.x < rhs.x;
if( lhs.y != rhs.y ) return lhs.y < rhs.y;
return lhs.z < rhs.z;
}