简短的解决方案是对对象的C 向量相互依赖

Short Solution to Sort a C++ Vector of Objects with Dependencies to Each Other?

本文关键字:向量 依赖 解决方案 对象      更新时间:2023-10-16

我刚刚写了一部分软件的部分,其中以正确的方式订购了字段。每个字段可以取决于其他字段。循环已经在上一步中检查和防止。

我当前的代码有效,但不是很优雅。我在列表中迭代并将依赖的条目移到前面,直到不需要移动为止。

在这里,一个最小的示例说明了问题:

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
struct Obj {
    std::string name;
    std::vector<std::string> dependencies;
};
std::vector<Obj*> objects;
void printObjList(std::string title) {
    std::cout << title << std::endl;
    for (auto obj : objects) {
        std::cout << "- " << obj->name << std::endl;
    }
}
int main()
{
    objects.push_back(new Obj {"d", {}});
    objects.push_back(new Obj {"a", {"c", "d"}});
    objects.push_back(new Obj {"b", {}});
    objects.push_back(new Obj {"c", {"e", "d"}});
    objects.push_back(new Obj {"e", {"b"}});
    printObjList("Unsorted");
    std::stable_sort(objects.begin(), objects.end(), [](Obj *a, Obj *b) {
        return a->name < b->name;
    });
    //std::stable_sort(objects.begin(), objects.end(), [](Obj *a, Obj *b) {
        // ???
    //});
    printObjList("Sorted by Dependencies");
    return 0;
}

在此处使用代码:http://coliru.stacked-crooked.com/a/902e91b00924a925

在之前,必须对另一个对象中的dependencies的一部分进行排序,该对象包含dependencies列表中的参考。

我认为有一些众所周知的算法可以解决此类问题?

在我的快速评论中详细说明:

如果您已经检查了项目中没有循环,那么您拥有的是一个定向的无环图(DAG(。

分类是所谓的拓扑排序的问题: (https://en.wikipedia.org/wiki/topologice_sorting(它已经知道有效的解决方案,例如Kahn的算法,尽管要利用它的效率,您必须小心地存储节点和边缘,以便如何存储节点和边缘某些操作(例如,找到没有传入边缘的节点(是有效的(恒定时间(

一些众所周知的库,例如Boost也提供了实现:http://www.boost.org/doc/libs/1_33_1/libs/graph/doc/topology_sort.html