简短的解决方案是对对象的C 向量相互依赖
Short Solution to Sort a C++ Vector of Objects with Dependencies to Each Other?
我刚刚写了一部分软件的部分,其中以正确的方式订购了字段。每个字段可以取决于其他字段。循环已经在上一步中检查和防止。
我当前的代码有效,但不是很优雅。我在列表中迭代并将依赖的条目移到前面,直到不需要移动为止。
在这里,一个最小的示例说明了问题:
#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
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 简短的解决方案是对对象的C 向量相互依赖
- 如何检查两个 n 大小的向量是否线性依赖于C++
- 如何在具有依赖元素类型的模板类构造函数中初始化向量
- 内在循环依赖C++顶点和向量