저는 대각선 원칙 인 diagonal
클래스를 사용했습니다. 공간을 최소화하기 위해 point
의 목록을 저장하는 대신 {begin: point, size: int}
을 저장합니다.기본 컨테이너가 실제 객체를 저장하지 않는 반복자에 대한 연산자 오버플로 -
이제 알고리즘을 구현하기 쉽습니다. iterable을 대각선으로 만들 수 있습니다. 내 반복자를 통해 참조 또는 포인터를 반환 할 수없는 용기의 어디에도 저장 더 point
없다 그래서 나는 1 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 (copyable) 객체를 생성하고 리턴해야합니다.
그래서 내 참조 typedef는 실제로 참조가 아닙니다. 괜찮아?
point
개체를 반환하는 operator->()
을 구현할 수 없으므로 어떤 포인터, point*
또는 포인터를 반환해야합니다. 사용자가 삭제해야하기 때문에 나는 단지 new point(operator*())
을 반환 할 수 없습니다. 그래서 대신 shared_ptr
을 사용하고 있습니다. 괜찮아?
해당 C++ 11 때문에 unique_ptr
을 사용할 수 없습니다. scoped_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*());
}
: 그것은 결국 포인터를 반환하지 결과에 도달 할 때까지 operator->()
에 호출 체인됩니다
왜 반복자 자체에 점을 저장하지 않습니까? –