Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种有效的方法可以对具有父/子关系的对象数组进行排序?_C++_Algorithm_Sorting_Parent Child - Fatal编程技术网

C++ 有没有一种有效的方法可以对具有父/子关系的对象数组进行排序?

C++ 有没有一种有效的方法可以对具有父/子关系的对象数组进行排序?,c++,algorithm,sorting,parent-child,C++,Algorithm,Sorting,Parent Child,我试图找出一种有效的方法来对数组进行排序,其中每个对象都可以指向同一数组中父对象的索引。 每个对象可以没有父对象索引为-1,也可以只有一个父对象,因此它只是多对一关系。 可以将任意数量的对象链接在一起,从而创建深层层次结构。 但是,它们都在一个连续数组中,并以任意顺序添加 下面是一个对象外观的示例: struct Object { void* data; int ParentIndex; //Will either be '-1' or will be an index in

我试图找出一种有效的方法来对数组进行排序,其中每个对象都可以指向同一数组中父对象的索引。 每个对象可以没有父对象索引为-1,也可以只有一个父对象,因此它只是多对一关系。 可以将任意数量的对象链接在一起,从而创建深层层次结构。 但是,它们都在一个连续数组中,并以任意顺序添加

下面是一个对象外观的示例:

struct Object
{
    void* data;

    int ParentIndex; //Will either be '-1' or will be an index in 'objects' where the parent of this object is.
};

std::vector<Object> objects;
对于多对一关系,似乎唯一的方法是对每个父级使用深度递归。 然而,这具有极其糟糕的性能。
是否存在可以处理此类问题的算法?

您必须考虑以下问题:

理论上,它可能包含一个递归链。两个或多个对象互为父对象。 排序时,移动父对象时,它必须更新其所有子对象。 因此,我认为唯一有效的方法是将其转换为带有指针而不是索引的图多子树

struct Object2
{
    void* data;
    Object2* FirstChild; // Will point to first child (if there is), or null.
    Object2* NextSibling;// Will point to next sibling (if there is), or null.
};
实际上,您可以使用任何XML库对其进行排序:

任何子元素都只需要附加到父元素。 完成后,从XML中读取元素并使用新索引重新排序。
你需要树数组实现,4xmpl为什么数组需要某种特殊的排序,让每个子数组指向它的父数组?无论数组如何排序,每个父级都有一个有效的索引。为什么可以按任意顺序添加它们很重要?我认为你的问题遗漏了重要的信息。你是在寻找答案吗?如果没有,你想要什么顺序?我将在一个非常紧密的循环中更新对象,我希望我可以把它们放在连续的内存中,只检查数组。不幸的是,似乎真的不可能保证父母在孩子面前。