独特的无向边缘

时间:2016-05-20 20:32:45

标签: c++11

我想在C ++中创建一个集合(在数学上讲,而不是std :: set)的唯一元素。我的元素是std::pair<int, int>,它们代表了一个优势。因为这些边缘不是定向的,所以我不想要像(3,4)和(4,3)那样重复。我怎样才能在C ++中实现这一目标?

2 个答案:

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