假设我想在C++中实现一个数据结构来存储面向图.由于STL容器,Arcs将存储在节点中.我希望用户能够以类似STL的方式迭代节点的弧.
我遇到的问题是我不希望在Node类(实际上是一个抽象基类)中公开我将在具体类中实际使用的STL容器.因此,我不希望我的方法返回std :: list :: iterator或std :: vector :: iterator ...
我试过这个:
class Arc;
typedef std::iterator<std::random_access_iterator_tag, Arc*> ArcIterator; // Wrong!
class Node {
public:
ArcIterator incomingArcsBegin() const {
return _incomingArcs.begin();
}
private:
std::vector<Arc*> _incomingArcs;
};
Run Code Online (Sandbox Code Playgroud)
但这不正确,因为vector :: const_iterator不能用于创建ArcIterator.那么这个ArcIterator可以是什么?
我发现这篇论文关于STL的自定义迭代器,但它没有帮助.我今天一定有点沉重......;)
试试这个:
class Arc;
class Node {
private:
std::vector<Arc*> incoming_;
public:
typedef std::vector<Arc*>::iterator iterator;
iterator incoming_arcs_begin()
{ return incoming_.begin(); }
};
Run Code Online (Sandbox Code Playgroud)
并在其余代码中使用Node :: iterator.当/如果更改容器,则必须在单个位置更改typedef.(您可以使用额外的typedef进一步实现存储,在本例中为vector.)
至于const问题,要么将vector的const_iterator定义为你的迭代器,要么像vector一样定义double迭代器类型(const和非const版本).