嵌套容器的STL迭代器(例如vector <vector <t>&gt;)</vector <t>

时间:2014-01-12 12:53:29

标签: c++ vector stl iterator containers

最近我不得不用一组类似的容器替换一个容器。因此,我需要一个保留原始迭代器语义的组合迭代器。 我遇到的问题是处理组合的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 ==()中进行三次比较?

0 个答案:

没有答案