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_iterator
또는 reverse_const_iterator
.
도움이 되길 바랍니다.