重载运算符<对于std :: set

时间:2014-10-14 15:32:32

标签: c++ c++11

我有一个名为Dist的结构

struct Dist {
    Point firstPoint, secondPoint;
    double value;
};

struct distCompare {
    bool operator()(const Dist& x, const Dist& y) const {
        return x.value < y.value;
    }
};

我有一个存储此对象的设置。

std::set<Dist, distCompare> distList;

如果x.firstPoint==y.firstPoint and x.secondPoint==y.secondPoint,则x和y等两个Dist相等 由于distCompare比较了两个Dists的值,我不能像这样使用set::find

for (auto q:input) {
    Dist tempDist; tempDist.firstPoint = p; tempDist.secondPoint = q;
    auto it = distList.find(tempDist);
    if (it != distList.end()) { //'it' is always distList.end() 
        distList.erase(it); 
    }
}

我的Point类看起来像这样:

class Point {
public:
    Point(double a, double b){ x = a; y = b; }
    Point(){}
    double getX() const { return x; }
    double getY() const { return y; }
    void setX(double item){ x = item; }
    void setY(double item){ y = item; }

private:
    double x, y;
};

如何重载运算符&lt;这样我就可以使用set::find找到相同的Dists?

1 个答案:

答案 0 :(得分:1)

std::set<T, Cmp>::find进行二元搜索,依赖于元素是有序的这一事实,并且总是使用Cmp来决定等价(这与相等不同),所以如果你没有& #39; t希望它根据distCompare查找...然后不要在集合中使用distCompare

由于distCompare定义的排序与Dist对象的相等定义完全无关,因此无法使用distCompare排序执行快速二进制搜索以查找对象被完全不同的功能认为是相同的。你可以有两个&#34;相等&#34;根据您的相等定义,但是根据distCompare定义的顺序在集合的两端排序。

您的选择是:

  • 更改集合的比较函数,以便比较相等的项目也使用比较函数比较等效项。

  • 用多索引容器替换该集合,例如Boost.MultiIndex。

  • 通过设置

  • 执行线性搜索