2

我有一个名为 Point 的类(在外部库中,我无法修改代码),用于表示 3d 空间中的点:

int x = 0; int y = 0; int z = 0;
Point my_point p(x,y,z);

它重载了==and!=运算符,但不重载<or >。我需要以有效的方式存储它们(没有双重元素,没有重复)。我以为我的数据结构是set,但如果我尝试使用,我会收到此错误:

error: no match for ‘operator<’ in ‘__x < __y’

一些忠告?

4

3 回答 3

5

编写一个比较运算符,并用它实例化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; 
于 2012-04-18T09:21:34.417 回答
3

您可以定义一个比较函子并将其作为第二个模板参数传递给 std::set。看这里,看Compare。也可以定义bool operator<(const Point& lhs, const Point& rhs),但是如果不能碰类,这就需要通过 的公共接口来实现比较Point

于 2012-04-18T09:21:51.393 回答
1

您可以自己定义运算符 <。如果 x、y 和 z 可从 Point 的公共接口获得,则它不必位于 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;
}
于 2012-04-18T09:23:11.883 回答