2016-03-24 9 views
2

いくつかのベクトルのイテレータの私の実装:のstd ::ソート認識しない反復子カテゴリ

class iterator : public std::iterator<std::input_iterator_tag, int> { 
    Vector<T> *vector; 
    size_t position; 

public: 
    iterator(Vector<T> *vector_, size_t idx) {...}; 
    iterator(const iterator &it) {...}; 
    friend bool operator == (const iterator &a, const iterator &b) {...}; 
    friend bool operator > (const iterator &a, const iterator &b) {...}; 
    friend bool operator < (const iterator &a, const iterator &b) {...}; 
    friend bool operator >= (const iterator &a, const iterator &b) {...}; 
    friend bool operator <= (const iterator &a, const iterator &b) {...}; 
    friend bool operator != (const iterator &a, const iterator &b) {...}; 
    iterator &operator = (const iterator &b) {...}; 
    T operator *() {...}; 
    iterator &operator ++() {...} 
    iterator &operator --() {...} 

    std::ptrdiff_t operator - (const iterator &b) const {...} 
}; 

しかし、理由はランダムアクセスのようstd::sort(vector.begin(), vector.end())出力no operator +=のようなエラーが、実際にポイントstd::sortお菓子私のイテレータを呼び出す来るため。どうして?

+3

質問とは無関係に、 'input_iterator_tag'はこのイテレータの正しいタグではなく、' int'は正しい 'value_type'ではありません。 – Barry

+2

明らかに 'std :: sort'のドキュメントを読んだことはありませんが、推測でプログラミングしています。 –

答えて

7

std::sortは、RandomAccessIteratorが必要です。あなたは互換性のないイテレータを与えたことを認識するかもしれませんが、それはまだ動作しません。

+0

私は、 'std :: sort'は**変更可能な' 'RandomAccessIterator'を必要とすることを追加します。 l値参照を返す 'operator *()'を用意してください。たとえば、LibstdC++ - v3ではこれが必要です(挿入ソート内では、 'sort'から呼び出されます)。 –

関連する問題