重载运算符 - > for iterator,其中底层容器不存储真实对象

时间:2013-05-19 19:12:20

标签: c++ iterator operator-overloading

我有一个diagonal类作为主要对角线。为了最小化空间,我存储{begin: point, size: int}而不是存储point的列表

现在我的算法很容易实现如果我可以使对角线可迭代。所以我写了一个point_iterator

class point_iterator{
  friend class diagonal;
  const diagonal& _diagonal;
  size_t    _position;
  public:
    typedef point_iterator self_type;
    typedef point value_type;
    typedef point reference;//< returning value instead of reference
    typedef boost::shared_ptr<point> pointer;//< it can never return pointer
    typedef std::random_access_iterator_tag iterator_category;
    typedef boost::int32_t difference_type;
  public:
    pointer operator->(){return pointer(new point(_diagonal.at(_position)));}
    point operator*(){return _diagonal.at(_position);}

因为容器中的任何地方都没有point,所以我无法通过迭代器返回引用或指针。因此,在所有情况下,我都要创建一个点(可复制)对象并返回。

所以我的引用typedef实际上不是引用。这没关系吗?

我无法实现返回operator->()对象的point,它必须返回一些指针,point*或指针。我不能只返回new point(operator*()),因为用户需要删除它们。所以我使用的是shared_ptr。这没关系吗?

我无法使用unique_ptr因为它的C ++ 11。并且scoped_ptr不可复制。

1 个答案:

答案 0 :(得分:3)

您可以返回存储point并提供operator->()重载的对象:对operator->()的调用将被链接,直到它最终获得返回指针的结果:< / p>

class point_pointer
{
private:
    point m_p;
public:
    point_pointer(point p): m_p(p) {}
    pointer const* operator->() { return &this->m_p; }
};

point_pointer point_iterator::operator->() const {
    return point_pointer(this->operator*());
}

虽然这种方法可行,但在迭代器中存储point可能是出于性能原因和对象生命周期的观点而优选的。