私は、フィールドが正しい方法で整理されたソフトウェアの一部を書きました。各フィールドは、0〜n個の他のフィールドに依存することができます。ループは、前のステップで既にチェックされ、防止されています。依存関係を持つオブジェクトのC++ベクタを互いにソートするための簡単な解決策
現在のコードは動作しますが、それほどエレガントではありません。私はリストを反復し、必要な移動がなくなるまで、依存するエントリを前面に移動します。ここで
問題点を説明する最小限の例:
#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
リストに参照が含まれています。
私はこの種の問題を解決するためのいくつかのよく知られたアルゴリズムがあると仮定します。
こんにちは、私はあなたが何であるかと思いますTopological Sorting問題のアルゴリズムを探しています: https://en.wikip edia.org/wiki/Topological_sorting Kahnのアルゴリズム – Loonquawl