我有一个自定义的数据结构,就像下面:使用自定义迭代器升压迭代
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。我怎样才能实现这些使用boost迭代器库?
此外,我可能需要采取谓词允许过滤
一些指针上手会有很大的帮助。一个解释:我不能使用C++ 0x编译器标志,因为我只需要使用C++ 98。所以,请建议一个不需要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;
};
澄清一点:我无法使用的C++ 0x。所以,请建议一个不需要C++ 11或C++ 03编译器标志的解决方案。 – soumeng78
这就是我所得到的:你甚至不知道你使用的是什么编译器级别,并且你希望我们为你做你的工作。 (当然你可以**使用C++ 03。)。另外,编辑你的问题。标签用于标记。评论不适用于编辑。 – sehe
“我可能需要采用谓词来允许过滤” - 我忽略了这一点,因为它不是一个问题的一部分,它不是什么意思(我可以想到它可能意味着一些不同的东西)。 – sehe