【发布时间】:2011-10-03 18:36:45
【问题描述】:
这是一个相当普通的 STL 容器封装,它允许 Cfoo 的用户迭代容器而不允许更改内部结构。
#include <vector>
class Cfoo
{
public:
class Cbar
{
/* contents of Cbar */
};
typedef std::vector<Cbar> TbarVector;
typedef TbarVector::const_iterator const_iterator;
public:
const_iterator begin() const { return( barVector_.begin() ); }
const_iterator end() const { return( barVector_.end() ); }
private:
TbarVector barVector_;
};
到目前为止,一切都很好。我们可以像这样迭代容器:
Cfoo myFoo;
for (Cfoo::const_iterator it = myFoo.begin(); it != myFoo.end(); ++it)
{
it->DoSomething();
}
现在我想用嵌套的 std::vector 替换 std::vector:
public:
typedef std::vector<Cbar> TbarVectorInner;
typedef std::vector<TbarVectorInner> TbarVectorOuter;
private:
TbarVectorOuter barContainer_;
但我希望能够以与以前相同的方式迭代 Cbar 的所有实例,公开一个 const_iterator、一个 begin()const 和一个 end()const 方法。
我不清楚如何做到这一点,但我怀疑它涉及编写自定义迭代器。有什么想法吗?
【问题讨论】:
-
它涉及编写自定义迭代器。
-
听起来像是来自 stackoverflow.com/questions/3623082/flattening-iterator 的 Flattening Iterator 的工作
-
TbarVector应该是私有的,它告诉外界与它无关的东西并且容易被滥用。