2011-09-18 31 views
4

我有以下简单Graph类,其中对于每个Node,我存储一组传出Arcs如何编写标准的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; 
}; 

我怎样才能在图中提供了一个标准的C++ iterator在所有弧迭代没有按的(顺序没关系),它隐藏了曲线如何存储在图中?

我想用它类似于以下:

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

我听到boost::iterator,但我觉得混乱。也许有人可以提供一个提示如何在这种情况下使用它?

+0

也许只是做'类型定义常量性传播疾病:: map <...>'Graph'内部然后定义函数(即'arcsBegin()'和'arcsEnd()')? – quasiverse

+0

[C++中的自定义迭代器]的可能重复(http://stackoverflow.com/questions/839958/custom-iterator-in-c) –

回答

2

如果您不想使用boost,请查看迭代器必须提供的内容:STL documentation。您可以使用boost iterator library。请参阅iterator_facade tutorial,这非常接近您要求的内容。

+0

除此之外,我发现阅读STL源代码很有帮助(http:///www.sgi.com/tech/stl/download.html)。具体来说,我使用上面引用的文档来找到一个类似于我正在编写的数据结构的迭代器(例如,我的数据结构的迭代器需求接近于stl :: list的迭代器需求,所以我使用了文档参考上面的回答,看看使用stl :: list的迭代器类型)。然后,我从刚才包含的链接中读取std :: list :: iterator源代码。希望有所帮助。 – Homer6

1

创建里面有两个迭代器的类:一个在map上,另一个在set上。

每个++用于设置迭代器。到达最后时,增量映射迭代器并重新初始化集合迭代器。

您也可以使用boost :: iterator_facade - 这将不利于实现迭代算法,但会尽量减少对使您的迭代器STL兼容期待你的努力......