[c++] 创建我自己的迭代器



Answers

/编辑:我看到,自己的迭代器实际上在这里是必要的(我误解了第一个问题)。 不过,我将下面的代码放在了代码中,因为它在类似的情况下很有用。

在这里实际上需要一个自己的迭代器吗? 也许将所有必需的定义转发到容器中保留实际点就足够了:

// Your class `Piece`
class Piece {
private:
    Shape m_shape;

public:

    typedef std::vector<Point>::iterator iterator;
    typedef std::vector<Point>::const_iterator const_iterator;

    iterator begin() { return m_shape.container.begin(); }

    const_iterator begin() const { return m_shape.container.begin(); }

    iterator end() { return m_shape.container.end(); }

    const_iterator end() const { return m_shape.const_container.end(); }
}

这是假设你在内部使用vector但类型可以很容易地进行调整。

Question

我试图学习C ++,所以如果这个问题显示缺乏基本知识,那么请原谅我,你看,事实是,我缺乏基本的知识。

我想了解如何为我创建的类创建迭代器。

我有一个'Shape'类,它有一个Points的容器。 我有一个'Piece'类,它引用了一个Shape并为Shape定义了一个位置。 件没有一个形状,它只是引用一个形状。

我希望它看起来像Piece是一个点的容器,它与它引用的形状相同,但是增加了Piece位置的偏移量。

我希望能够遍历Piece's Points,就像Piece本身就是一个容器一样。 我已经做了一些阅读,没有找到任何帮助我的东西。 我会非常感谢任何指针。




用C ++编写自定义迭代器可能非常冗长而且难以理解。

由于我找不到写一个自定义迭代器的最简单的方法,我写了这个可能有用的模板头文件 。 例如,要使Piece类可迭代:

#include <iostream>
#include <vector>

#include "iterator_tpl.h"

struct Point {
  int x;
  int y;
  Point() {}
  Point(int x, int y) : x(x), y(y) {}
  Point operator+(Point other) const {
    other.x += x;
    other.y += y;
    return other;
  }
};

struct Shape {
  std::vector<Point> vec;
};

struct Piece {
  Shape& shape;
  Point offset;
  Piece(Shape& shape, int x, int y) : shape(shape), offset(x,y) {}

  struct it_state {
    int pos;
    inline void next(const Piece* ref) { ++pos; }
    inline void begin(const Piece* ref) { pos = 0; }
    inline void end(const Piece* ref) { pos = ref->shape.vec.size(); }
    inline Point get(Piece* ref) { return ref->offset + ref->shape.vec[pos]; }
    inline bool cmp(const it_state& s) const { return pos != s.pos; }
  };
  SETUP_ITERATORS(Piece, Point, it_state);
};

然后你就可以使用它作为一个正常的STL容器:

int main() {
  Shape shape;
  shape.vec.emplace_back(1,2);
  shape.vec.emplace_back(2,3);
  shape.vec.emplace_back(3,4);

  Piece piece(shape, 1, 1);

  for (Point p : piece) {
    std::cout << p.x << " " << p.y << std::endl;
    // Output:
    // 2 3
    // 3 4
    // 4 5
  }

  return 0;
}

它还允许添加其他类型的迭代器,如const_iteratorreverse_const_iterator

我希望它有帮助。




你可以阅读这篇ddj文章

基本上,从std :: iterator继承来完成大部分为你完成的工作。




Related



Tags

c++ c++   iterator