3

次のようなデータ構造を解析するアプリケーションを作成しています

struct Block
{
  std::string foo;
  /* ... even more local data ... */
};

std::map<std::string, Block> blockContainer; // Each Block will have a name here

struct Signal
{
  // the direct links to the Blocks, no redundant storage of the name so that an
  // simple renaming of a Block would be possible
  std::map<std::string, Block>::iterator from; 
  std::map<std::string, Block>::iterator to;

  std::string bar;
  /* ... even more local data ... */
};

std::vector<Signal> signalContainer;

このリストの解析と入力は非常に簡単でした。ここで、シグナルに応じてブロックのトポロジカル ソートを行う必要があります。これも、 を使用すると非常に簡単Boost::Graphです。

しかし、最初にそれを STL データ構造で解析してから Boost::Graph 構造にコピーすることは、私にはあまり意味がありません。特に、後でこのデータを使用して行われるのは、おそらくいくつかの単純な変更 (ブロックとシグナルの追加/削除、いくつかのシグナルの再ルーティング、再シリアル化) であり、後で新しいトポロジー ソートが行われるためです。

したがって、これらの可能な解決策のいずれでも問題ありません。

  1. Boost::Graph をコンテナで直接動作させる
  2. データを Boost::Graph データ構造に直接解析します (たとえば、 のようなバンドルされたプロパティを持つグラフを使用しますboost::adjacency_list<boost::mapS, boost::vecS, boost::directedS, Block, Signal>) 。

しかし、私はどちらかを行うためにここにあるドキュメントを理解できるほど頭が良くないようです。また、ネットで見つけたすべての例は、バンドルされたプロパティの使用方法を示していましたが、オンザフライでグラフを構築する方法は示していませんでした。(もちろん、ノードと頂点のプロパティを同時に使用したり、ノードに a を使用しstd::mapてノードに名前でアクセスしたりする方法はありません...)

誰かが私を助けることができますか?

ありがとう!

4

1 に答える 1

4

boost::graph のドキュメントを理解できるほど知的な人は誰もいません ;) 使い方を学ぶには多くの時間がかかります。

データの周りにブースト グラフ構造を作成できますが、これはおそらくかなり面倒です。そこにドキュメントがあります:http://www.boost.org/doc/libs/1_52_0/libs/graph/doc/leda_conversion.html

2 番目のアプローチを使用することをお勧めしますが、データ構造がよくわかりません。

この質問を見ましたか:ブースト グラフにカスタム頂点を追加することは、あなたのニーズに答えますか?

ノード (またはエッジ) を作成し、プロパティを一度に定義するには、次の手順を実行することもできます。

vertex_t u = boost::add_vertex(Block(42, "hi"), g);

解析中にマップを維持する必要がある場合があります。

于 2012-12-16T17:17:16.653 に答える