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

标签 c++ algorithm sorting c++11 std

我刚刚编写了一个软件的一部分,其中字段以正确的方式排序以进行处理。每个字段可以依赖 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

关于c++ - 对相互依赖的对象的 C++ vector 进行排序的简短解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394462/

相关文章:

c++ - 引用类型删除的 void*

algorithm - 解释以下算法以求 nCr 模 P

algorithm - 需要算法帮助

python - Pandas 中的多索引排序

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、 bool 值)

c++ - 图像作为源代码文档/注释的一部分?

c++ - 在对象 vector 中找到最大值

c++ - 编译问题。错误 E0413、E0434、C2664、C2440

algorithm - 组合的动态编程习语

VBA Sort DIR 按字母顺序传输数据