将不可比较的对象添加到集合中

时间:2012-04-18 09:17:48

标签: c++ data-structures set

我有一个名为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’

一些建议?

3 个答案:

答案 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;
}