C++ 用于嵌套容器(如vector<;vector<;T>;)的STL迭代器

C++ 用于嵌套容器(如vector<;vector<;T>;)的STL迭代器,c++,vector,stl,iterator,containers,C++,Vector,Stl,Iterator,Containers,最近,我不得不用一组类似的容器替换一个容器。因此,我需要一个组合迭代器来保留原始迭代器的语义。 我遇到的问题是如何处理组合end()位置。由于没有比较未分配迭代器的能力,我不得不将所有四个迭代器都作为成员(即两个范围,外部和内部)。这导致运算符==()在最常见的情况下需要进行三次比较。当然,这比普通嵌套循环中的比较要糟糕得多(在最常见的情况下需要进行单个比较)。除此之外,我注意到四个迭代器代码很容易出错,因为如果容器内容在循环中发生变化,将end()迭代器保留在组合迭代器中可能会导致跳过for(

最近,我不得不用一组类似的容器替换一个容器。因此,我需要一个组合迭代器来保留原始迭代器的语义。 我遇到的问题是如何处理组合end()位置。由于没有比较未分配迭代器的能力,我不得不将所有四个迭代器都作为成员(即两个范围,外部和内部)。这导致运算符==()在最常见的情况下需要进行三次比较。当然,这比普通嵌套循环中的比较要糟糕得多(在最常见的情况下需要进行单个比较)。除此之外,我注意到四个迭代器代码很容易出错,因为如果容器内容在循环中发生变化,将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()); }
   };
模板
类霉菌容器
{
typedef std::向量内部;
typedef std::向量外部;
外v_;
公众:
类迭代器
{
朋友级MyContainer;
外部::迭代器it1,it1结束;
内部::迭代器it2,it2结束;
迭代器(外部::迭代器it1,外部::迭代器it1end):
it1(it1),it1结束(it1结束)
{
如果(it1_!=it1结束){
it2=it1->begin();
IT2结束=it1结束->结束();
}
}
公众:
布尔运算符==(迭代器it)常量{
返回it1\u==it.it1\u&&
(it1_==it1结束| | it2_==it.it2_41;);
}
};
迭代器begin(){返回迭代器(v_u.begin(),v_u.end());}
迭代器end(){返回迭代器(v_u.end(),v_u.end());}
};

考虑到这些因素,有没有一种方法可以实现嵌套迭代器语义,而不必存储两个end()值,或者不需要在操作符==()中进行三次比较?

怎么样?谢谢!我按照链接找到了一个“展平迭代器”示例。它看起来很好,很熟悉,但问题仍然存在。它需要存储三个迭代器,并在每个for()循环迭代中最常见的情况下进行四次(!)比较。看起来我们无法保留外部语义并保持原有的效率。如果您将两个不同的容器视为同一个容器,也许您应该找到一种方法使这两种类型相同,以便所有数据可以共存于同一个容器中。这很可能涉及创建一个新类型(可能使用继承)。我理解您的方法,但在我的情况下,我需要实际拆分原始容器,以便在填充时获得哈希访问,并在读取结果时获得顺序访问。您可能还想阅读Matt Ostern的旧论文。它使用标记分派来允许通用算法处理分段结构,而不是将范围展平以处理现有代码。但是,它不允许您像展平迭代器那样在一个地方维护整个更改。