我有一个名为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?
答案 0 :(得分:1)
std::set<T, Cmp>::find
进行二元搜索,依赖于元素是有序的这一事实,并且总是使用Cmp
来决定等价(这与相等不同),所以如果你没有& #39; t希望它根据distCompare
查找...然后不要在集合中使用distCompare
!
由于distCompare
定义的排序与Dist
对象的相等定义完全无关,因此无法使用distCompare
排序执行快速二进制搜索以查找对象被完全不同的功能认为是相同的。你可以有两个&#34;相等&#34;根据您的相等定义,但是根据distCompare
定义的顺序在集合的两端排序。
您的选择是:
更改集合的比较函数,以便比较相等的项目也使用比较函数比较等效项。
用多索引容器替换该集合,例如Boost.MultiIndex。
通过设置