C++ 迭代器对向量中的某些元素进行迭代

use*_*849 5 c++ iterator stl

如果这是一个微不足道的问题,请原谅我,我只是在学习 C++,并试图理解某些概念。尤其是当涉及到迭代器时,我完全迷失了。

假设我有一个表示某种数据结构的自定义类,其成员之一是整数向量。我想为该类编写一个双向迭代器,它仅输出向量中的偶数。有没有简单且有启发性的方法?我不想使用 STL 以外的库。

dse*_*ara 1


#include <vector>
#include <iostream>

class X {

public:

  class EvenIterator {
  public:
    EvenIterator(std::vector<int>::iterator it, std::vector<int>::iterator end) : it(it), end(end) {
      while (true) {
        if (isEven(*it)) {
          break;
        } else if (it == end) {
          break;
        }
        it++;
      }
    }

    bool operator != (const EvenIterator& evenIt) {
      return evenIt.it != this->it;
    }

    int operator * () {
      return *it;
    }

    EvenIterator operator ++ () {
      while (true) {
        it++;
        if (isEven(*it)) {
          return EvenIterator(it, end);
        } else if (it == end) {
          return EvenIterator(it, end);
        }
      }
    }
  private:
    std::vector<int>::iterator it;    
    std::vector<int>::iterator end;    
  };

  static bool isEven(int number) {
    return number % 2 == 0;
  }

  void add(int number) {
    v.push_back(number);
  }

  EvenIterator evenBegin() {
    return EvenIterator(v.begin(), v.end());
  }

  EvenIterator evenEnd() {
    return EvenIterator(v.end(), v.end());
  }

private:
  std::vector<int> v;

};

int main() {
  X x;
  x.add(1);
  x.add(2);
  x.add(3);
  x.add(2);
  x.add(2);
  x.add(31);
  x.add(56);
  x.add(101);

  for (X::EvenIterator it = x.evenBegin(); it != x.evenEnd(); ++it){
    std::cout << *it << std::endl; // only prints the even numbers
  }
}

Run Code Online (Sandbox Code Playgroud)