2011-09-18 6 views
4

私は各Nodeのために、私が出て行くArcsのセットを格納する次のような単純なGraphクラス、持っている:標準のC++イテレータを書くには?

#include <iostream> 
#include <vector> 
#include <map> 
#include <set> 

struct Arc { 
    char label; 
    int targetNode; 
}; 

struct Graph { 
    std::vector<int> nodes; 
    std::map< int, std::set<Arc*> > outgoingArcsPerNode; 
}; 

どのように私は、繰り返しのdoesnの標準グラフ内のすべてのアークを超えるC++ iterator(順序を提供することができますがアークがグラフにどのように格納されているかを隠す)

私は、次のようにそれが似て使用したい:

int main() { 
    Graph g; 
    for (Graph::const_iterator it = g.arcsBegin(); it != g.arcsEnd(); ++it) { 
    Arc* a = *it; 
    } 
} 

私はboost::iteratorのことを聞いたが、私はそれが混乱を見つけます。たぶん、誰かがこのケースでそれを使う方法を示唆するかもしれませんか?

+0

おそらく、ちょうど 'のtypedef const_iteratorのSTDを行います:: map <...> '' 'Graph'の中に記述して、関数(つまり' arcsBegin() 'と' arcsEnd() ')を定義しますか? – quasiverse

+0

[C++でのカスタムイテレータ]の複製(http://stackoverflow.com/questions/839958/custom-iterator-in-c) –

答えて

2

ブーストを使用しない場合は、イテレータが提供する必要があるものを見てください:STL documentation

boost iterator libraryを使用してください。あなたが求めているものに非常に近いiterator_facade tutorialを参照してください。

+0

これに加えて、私はSTLソースを読むことが有用であることを発見しました(http: /www.sgi.com/tech/stl/download.html)。具体的には、上で参照したドキュメントを使用して、私が書いているデータ構造に似たイテレータを見つけました(例えば、私のデータ構造のイテレータ要件はstl :: listのものに近いので、上記のitelator型のstl :: listを参照してください)。次に、私はちょうど含まれているリンクからstd :: list :: iteratorソースを読みます。希望が役立ちます。 – Homer6

1

2つのイテレーターが内部にあるクラスを作成します.1つは地図上、もう1つはオーバーセットです。

各++はイテレータを設定するために適用されます。終了に達すると、マップイテレータをインクリメントし、セットイテレータを再初期化します。

また、あなたはブーストを使用することができます:: iterator_facadeを - それは反復のアルゴリズムを実装するのに役立ちませんが、STLの期待にあなたのイテレータは、互換性の作ることにあなたの努力を最小限に抑えることができます...

関連する問題