我想在C ++中创建一个集合(在数学上讲,而不是std :: set)的唯一元素。我的元素是std::pair<int, int>
,它们代表了一个优势。因为这些边缘不是定向的,所以我不想要像(3,4)和(4,3)那样重复。我怎样才能在C ++中实现这一目标?
答案 0 :(得分:2)
这些方面的一些东西,也许是:
using Edge = std::pair<int, int>;
struct CompareEdges {
bool operator()(const Edge& a, const Edge& b) const {
return Normalize(a) < Normalize(b);
}
private:
Edge Normalize(const Edge& e) {
if (e.first <= e.second) return e;
return {e.second, e.first};
}
};
std::set<Edge, CompareEdges> SetOfEdges;
答案 1 :(得分:0)
这是另一种解决方案,比较函数为lambda表达式。
using Edge = pair<int, int>;
std::set<Edge, std::function<bool(const Edge &, const Edge &)>> edges(
[](const Edge &a, const Edge &b)
{
const int x = min(a.first, a.second);
const int y = min(b.first, b.second);
if (x < y)
return true;
else if (y > x)
return false;
else
return max(a.first, a.second) < max(b.first, b.second);
}
);