对相互依赖的对象的 C++ 向量进行排序的简短解决方案?

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

我刚刚编写了一个软件的一部分,其中字段以正确的方式排序以进行处理。每个字段可以依赖 0-n 个其他字段。在上一步中已经检查并防止了循环。

我当前的代码可以工作,但不是很优雅。我遍历列表并将相关条目移到前面,直到不需要移动为止。

这是一个说明问题的最小示例:

#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/Topological_sorting) 具有已知的高效解决方案,例如 Kahn 的算法,尽管要利用它的效率,您必须小心存储节点和边的方式,以便某些操作(例如,找到一个没有传入边的节点)是有效的(恒定时间)

一些著名的库,如 boost 也提供了实现: http://www.boost.org/doc/libs/1_33_1/libs/graph/doc/topological_sort.html