C++ 重载运算符->;对于迭代器,底层容器不使用';不存储真实对象
我有一个C++ 重载运算符->;对于迭代器,底层容器不使用';不存储真实对象,c++,iterator,operator-overloading,C++,Iterator,Operator Overloading,我有一个diagonal类,它充当对角线原则。为了最小化空间,我正在存储{begin:point,size:int},而不是存储点的列表 现在,如果我能使对角线可解,我的算法将很容易实现。所以我写了一个点迭代器 class point_iterator{ friend class diagonal; const diagonal& _diagonal; size_t _position; public: typedef point_iterator self
diagonal
类,它充当对角线原则。为了最小化空间,我正在存储{begin:point,size:int}
,而不是存储点的列表
现在,如果我能使对角线可解,我的算法将很容易实现。所以我写了一个点迭代器
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);}
类点迭代器{
朋友类对角线;
常数对角线和u对角线;
尺寸(t)位置;;
公众:
typedef point_迭代器self_type;
类型定义点值\u类型;
typedef point reference;//<返回值而不是引用
typedef boost::shared_ptr pointer;//<它永远无法返回指针
typedef std::随机访问迭代器标记迭代器类别;
typedef boost::int32_t difference_type;
公众:
指针运算符->(){返回指针(新点(_对角线位于(_位置));}
点运算符*(){返回(_位置);}
由于容器中的任何位置都没有点
,因此我无法通过迭代器返回引用或指针。因此在所有情况下,我都必须创建一个点(可复制)对象并返回
所以我的引用typedef实际上不是引用,可以吗
我不能实现操作符->()
,它返回点
对象,它必须返回一些指针,点*
或类似指针。我不能只返回新点(操作符*())
,因为用户需要删除它们。所以我使用共享的ptr
。这样可以吗
我无法使用unique\u ptr
,因为它的C++11.和作用域的\u ptr
是不可复制的。您可以返回一个存储点的对象,并提供一个操作符->()
的重载:对操作符->()
的调用被链接,直到最终得到一个返回指针的结果:
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*());
}
尽管这种方法可行,但出于性能考虑,从对象生命周期的角度来看,在迭代器中存储点
可能更可取。为什么不在迭代器本身中存储点呢?您编写的范围内的ptr
是可复制的。类似于唯一的ptr
。我不应该使用/writ吗是否为此创建一个通用的copyable\u scoped\u ptr
?请注意,“指向”的对象实际上嵌入在point\u指针中。显然,这种方法可以推广,但我不认为它是一个copyable\u scoped\u ptr
:对象给出一个[partial]指针式指向对象的感觉。@NeelBasu区别在于,在这种情况下,没有堆分配,没有new
或delete
,就像智能指针一样,只有指向堆栈分配值对象的指针。