私は次のようなカスタムデータ構造を持っています:
class Node;
class GraphDM {
public:
GraphDM();
// these are to iterate on all items of _faninNodes
// like all elements in multimap
FaninIter faninBegin();
FaninIter faninEnd();
// these are to iterate on all items of _fanoutNodes
FanoutIter fanoutBegin();
FanoutIter fanoutEnd();
// these should work like equal_range of multimap
std::pair<FaninIter, FaninIter > getFanins (const Node *node_);
std::pair<FaninIter, FaninIter > getFanouts(const Node *node_);
private:
typedef std::vector< Node* > NodeList;
typedef boost::unordered_map< Node*,
NodeList > Map;
Map _faninNodes;
Map _fanoutNodes;
};
これらの API を実装する必要があります。ブースト反復子ライブラリを使用してこれらを実装するにはどうすればよいですか?
また、フィルタリングを可能にするために述語を取る必要があるかもしれません
開始するためのいくつかのポインターは非常に役立ちます。明確化の 1 つ: c++98 のみを使用する必要があるため、c++0x コンパイラ フラグは使用できません。したがって、c++11 または c++03 コンパイラ フラグを必要としないソリューションを提案してください。
また、(GraphDM クラスにネストされた) 次のような反復子を設計すると、基本的にデータ構造の詳細が公開されます。イテレータをマップのキー (値ではなく) でのみ反復するようにする方法はありますか? 次に、getFanins() と getFanout() に対して異なるタイプのイテレータを返すことができます。これは、値リストのイテレータになります。
class Iter : public boost::iterator_adaptor< Iter,
Map::iterator,
boost::use_default >
{
public:
Iter() : Iter::iterator_adaptor_() {}
private:
friend class GraphDM;
Iter(Map::iterator it)
: Iter::iterator_adaptor_(it) {}
friend class boost::iterator_core_access;
};