bkx*_*kxp 5 c++ containers iterator stl vector
最近,我不得不用一组类似的容器替换单个容器。因此,我需要一个保留原始迭代器语义的组合迭代器。我遇到的问题是处理组合的 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==() 中进行三个比较?
| 归档时间: | 
 | 
| 查看次数: | 1592 次 | 
| 最近记录: |