最近我不得不用一组类似的容器替换一个容器。因此,我需要一个保留原始迭代器语义的组合迭代器。 我遇到的问题是处理组合的end()位置。如果没有能够比较未分配的迭代器,我必须将所有四个迭代器都包含为成员(即两个范围,外部和内部)。这导致operator ==()在最常见的情况下需要三次比较。当然,这比普通嵌套循环(在最常见的情况下需要单个比较)中的比较要糟糕得多。除此之外,我注意到四个迭代器代码容易出错,因为如果容器内容在循环内部发生变化,那么在组合迭代器中保留end()迭代器可能会导致跳过for()循环的退出条件。这是我使用的代码的草图:
template <class T>
class MyContainer
{
typedef std::vector<T> Inner;
typedef std::vector<Inner> Outer;
Outer v_;
public:
class iterator
{
friend class MyContainer;
Outer::iterator it1_, it1end_;
Inner::iterator it2_, it2end_;
iterator(Outer::iterator it1, Outer::iterator it1end) :
it1_(it1), it1end_(it1end)
{
if(it1_!=it1end_) {
it2_ = it1_->begin();
it2end_ = it1_->end();
}
}
public:
bool operator==(iterator it) const {
return it1_==it.it1_ &&
(it1_==it1end_ || it2_==it.it2_);
}
};
iterator begin() { return iterator(v_.begin(), v_.end()); }
iterator end() { return iterator(v_.end(), v_.end()); }
};
考虑到这些注意事项,有没有办法实现嵌套迭代器语义而不必存储end()值或者不需要在operator ==()中进行三次比较?