【发布时间】:2021-09-15 17:16:54
【问题描述】:
在我的项目中,我有一些自定义类,大致结构如下。
Point,表示一个 2D int 坐标
struct Point {
int x;
int y;
}
Line,表示两点之间画的一条线
class Line {
Point start;
Point end;
}
多边形,表示由点数定义的多边形。
class Polygon {
private:
std::vector<Point> _vertices;
}
我正在尝试为 Polygon 实现一个自定义迭代器,目标是如下语法:
Polygon aPolygon;
Point somePoint;
for( auto line_it = aPolygon.begin(); line_it != aPolygon.end(); line_it++ ){
if( line_it->includes(somePoint) ){
// Do something
}
}
在对 Polygon 进行迭代时,第 n 个元素将是Line( _vertices[n], _vertices[n+1] ),
最后一个是Line( _vertices[_vertices.size() - 1], _vertices[0] )
如何实现这样的迭代器,或以其他方式获得具有可接受性能的类似语法?
我正在查看类似的问题,但我还没有找到一个足够类似的问题来提供全面的答案。 如果可能的话,我更喜欢使用 c++20 标准的 STL 解决方案。
我意识到这个问题不必要地含糊不清,更具体地说,我问的是如何为我的迭代器实现 *、-> 和 ++ 运算符。
class Polygon {
public:
/* ... */
struct PolygonIterator {
using iterator_category = std::input_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = Line;
using pointer = value_type*;
using reference = value_type&;
explicit PolygonIterator( Point* ptr ) : m_ptr( ptr ) {}
reference operator*();
// ^ Should return Line reference, but I have Point in container?
PolygonIterator& operator++();
pointer operator->();
bool operator==(const PolygonIterator& other);
private:
Point* m_ptr;
};
PolygonIterator begin() { return PolygonIterator( &_vertices.front() ); }
PolygonIterator end() { return PolygonIterator( &_vertices.back() ); }
【问题讨论】:
-
第 1 步:选择一个 iterator category。您可以从“前向迭代器”开始。第 2 步:创建课程。阅读您的类别的要求,并为该课程实施所有要求。
-
@HolyBlackCat 你能详细说明一下吗?我一直在 stackoverflow 上阅读 cppreference 和其他类似问题,但仍然不明白要求的实现应该是什么样子。
标签: c++ iterator containers c++20