STL在容器中存储无向图节点

时间:2013-12-05 17:54:33

标签: c++ stl containers

我需要存储唯一的

struct Node
    {
    int index_from;
    int index_to;
    };

在容器中。

条件下两个节点相等
  (a.index_from==b.index_from && a.index_to==b.index_to)
||(a.index_to==b.index_from && a.index_from==b.index_to)

节点需要按index_from

排序

可以使用哪个容器(除了循环数组以检查是否存在)?

操作:根据排序键从头到尾循环显示图表。添加唯一节点。

2 个答案:

答案 0 :(得分:0)

要使用std算法/函数对std容器的元素进行排序,您需要operator< (...),仅限。

比较节点:

bool operator < (const Node& a, const Node& b) {
   if(a.index_from < b.index_from) return true;
   else if(a.index_from == b.index_from) {
        if(a.index_to < b.index_to) return true;
   }
   return false;
}

但似乎你想比较节点之间的链接:

bool operator < (const Node& a, const Node& b) {
   int a0 = std::min(a.index_from, a.index_to);
   int a1 = std::max(a.index_from, a.index_to);
   int b0 = std::min(b.index_from, b.index_to);
   int b1 = std::max(b.index_from, b.index_to);
   if(a0 < b0) return true;
   else if(a0 == b0) {
        if(a1 < b1) return true;
   }
   return false;
}

注意:

  • 你可能有一个指向相反的等效链接 对方的方向。
  • 比较链接时,您可能不会使用 运算符,但传递给容器的比较对象

答案 1 :(得分:0)

(评论不足,所以这是一个“答案”)

“奇怪的平等”只是要注意两个节点之间的边是相同的(这是一个无向图,所以在所讨论的节点之间会有一条边,并且没有任何假设“方向“是固有的 - 即:给定任意两个节点a,b,如果a和b之间存在连接,则边缘(a,b)被认为等于边缘(ba)。”

检查等式的

会捕获“向后”节点,因此这些节点不会将其置于有效边缘描述集中,从而保留唯一性约束。

因此,如果您有节点a,b,c&amp; d,你有节点a和b,b和c之间的连接,c和d以及a和d,(a,b)的边缘; (公元前); (c,d)和(a,d)将被存储,但是(b,a)的边缘; (C,B); (d,c)和(d,a)将被排除在外。