2016-11-04 6 views
4

라이브러리에 반복기 클래스 (예 : MyIterator)를 쓰고 있습니다.const 반복자 및 비 const 반복자 만들기

std::vectoriterator 같은 std::vectorMyIterator 동안 행위의 const_iterator처럼 const MyIterator 행위를 만들기 위해 오버로드 CONST을 사용하는 것이 좋습니다?

라이브러리 사용자/개발자가 혼란에 빠질 수 있습니까? 대안은 CONST와 const가 아닌 반복자로 전문화 할 수있는 단일 반복자 클래스를 구현하는 템플릿을 사용하는 것입니다

// std::iterator example 
#include <iostream>  // std::cout 
#include <iterator>  // std::iterator, std::input_iterator_tag 

class MyIterator : public std::iterator<std::input_iterator_tag, int> 
{ 
    mutable int* p; 
public: 
    MyIterator(int* x) :p(x) {} 
    MyIterator(const MyIterator& mit) : p(mit.p) {} 
    MyIterator& operator++() {++p;return *this;} 
    MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;} 
    bool operator==(const MyIterator& rhs) {return p==rhs.p;} 
    bool operator!=(const MyIterator& rhs) {return p!=rhs.p;} 
    const int& operator*() const {return *p;} // <-- const overload 
    int& operator*() {return *p;} 
}; 

: 같은

구현 될 것이다. 나는 현재 그것을하고있다 (나는 부스트가 그렇게하고 있다고 들었다 ...). 그러나 범위를 구현할 때 템플릿이 매우 빠르게 복잡해지고 범위 범위가 확장됩니다 (루프 기반 중첩 범위와 같이).

+1

지옥은 'mit'입니까? 질문에 대한 답을 줄 수도 있습니다. – George

+1

@George itterator가'mit'라고 부르는대로 가져 가겠습니다. 아마도'my_iterator'의 줄임말입니다. – NathanOliver

+0

혼란 스러울 지 모르지만 그건 나뿐입니다. – jrok

답변

7
const_iterator이 상수 반복자 될 운명이되지 않기 때문에, 작동하지 않습니다 const_MyIterator ( const_iterator)의 대용으로 const MyIterator를 사용

하지만 상수 요소 반복 처리하는 반복자.

또한 const MyIterator을 사용하면 ++ 또는 --과 같은 수정 연산자를 사용할 수 없습니다. 이러한 연산자는 비 const 메서드이며 반복자 자체를 수정하기 때문입니다.

따라서 어떤 종류의 const_iterator을 제공하려는 경우이를 구현하지 않아도됩니다.

라이브러리 사용자/개발자가 혼란에 빠질 수 있습니까?

마지막으로, 귀하의 질문에 대답 : 예,이 때문에 const iteratorconst_iterator a의 다른 동작 (기대)으로, 그렇게 생각합니다.

+0

일할 수 있습니다. 반복자를 구현할 때 어떤 속성을 변경할 수 있을지 정의 할 필요가 있습니다. 비록 그것이 좋은 생각인지 나는 확실하지 않다. –

+0

@dotdotdot 아니, 절대적으로 * 좋은 생각이 아니다. 가능한 무엇인가가 당신이 그것을해야한다는 것을 의미하지는 않습니다. –

+0

예, 맞습니다. 기술적으로 가능합니다. 그러나 혼란에 가중되어'const' 객체의 동작에 대한 기대를 위반하게됩니다. –