【发布时间】:2012-11-20 05:16:41
【问题描述】:
我有一些这样的:
struct Node{
int value;
Node *left, Node *right;
Node(): value(0), left(0), right(0){}
}
std::vector<Node> nodeList = getNodes();
我想让上面的东西做一个循环缓冲区。所以
nodeList[i].left = &nodeList[i - 1];
nodeList[i].right= &nodeList[i + 1];
注意nodeList[0].left指向nodeList的末尾,nodeList.back().right指向nodeList的开头;
现在问题来了,nodeList[i].left 和 nodeList[i].right 只指向其前一个邻居的地址,并不一定指向实际的邻居对象。因此,如果我要对 nodeList 进行排序,左右指针将不再指向原始节点。相反,它们将指向新的左右邻居。希望问题很清楚,我怎样才能让例如 nodeList[1].left 指向 nodeList[0] 即使 nodeList[0] 被移动到不同的位置?
【问题讨论】:
-
你可以把它变成一个节点指针的向量。
-
是的,这是我最初的想法,但我想知道我是否可以避免这种情况。
-
如果你使用std::sort,你不是在移动内存中的节点,而是在复制它们。
-
@VCato,是的,我正在使用 std::sort。那么我的其他选择是什么?
-
我会保留 2 个向量,nodeList 和一个
std::vector<Node*> sortedNodeList。如果你对新的分配没问题,后者就足够了