我需要存储唯一的
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
排序可以使用哪个容器(除了循环数组以检查是否存在)?
操作:根据排序键从头到尾循环显示图表。添加唯一节点。
答案 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)将被排除在外。