2016-07-25 96 views
2

我的目標是學習如何從頭開始編寫自定義迭代器。我寫了下面的迭代器:實現自定義迭代器以使用std :: sort

#include <iterator> 

template<class D> 
class SpanIterator final : public std::iterator<std::random_access_iterator_tag, D> 
{ 
private: 
    D* _data; 

public: 
    explicit SpanIterator(D* data) : 
     _data{ data } 
    { 
    } 

    SpanIterator(const SpanIterator& itertator) = default; 

    SpanIterator& operator=(const SpanIterator& iterator) = default; 

    SpanIterator& operator=(D* data) 
    { 
     _data = data; 

     return *this; 
    } 

    operator bool() const 
    { 
     return _data != nullptr; 
    } 

    bool operator==(const SpanIterator& itertator) const 
    { 
     return _data == itertator._data; 
    } 

    bool operator!=(const SpanIterator& itertator) const 
    { 
     return _data != itertator._data; 
    } 

    SpanIterator& operator+=(const std::ptrdiff_t& movement) 
    { 
     _data += movement; 

     return *this; 
    } 

    SpanIterator& operator-=(const std::ptrdiff_t& movement) 
    { 
     _data -= movement; 

     return *this; 
    } 

    SpanIterator& operator++() 
    { 
     ++_data; 

     return *this; 
    } 

    SpanIterator& operator--() 
    { 
     --_data; 

     return *this; 
    } 

    SpanIterator operator++(int) 
    { 
     auto temp = *this; 

     ++_data; 

     return temp; 
    } 

    SpanIterator operator--(int) 
    { 
     auto temp = *this; 

     --_data; 

     return temp; 
    } 

    SpanIterator operator+(const std::ptrdiff_t& movement) 
    { 
     auto oldPtr = _data; 

     _data += movement; 

     auto temp = *this; 

     _data = oldPtr; 

     return temp; 
    } 

    SpanIterator operator-(const std::ptrdiff_t& movement) 
    { 
     auto oldPtr = _data; 

     _data -= movement; 

     auto temp = *this; 

     _data = oldPtr; 

     return temp; 
    } 

    D& operator*() 
    { 
     return *_data; 
    } 

    const D& operator*() const 
    { 
     return *_data; 
    } 

    D& operator->() 
    { 
     return _data; 
    } 
}; 

對此我的測試,像這樣:

#include <iostream> 
#include <array> 

int main() 
{ 
    std::array<double, 3> values = { 1, 2, 1 }; 

    SpanIterator<double> begin{ values.data() }; 
    SpanIterator<double> end{ values.data() + values.size() }; 

    std::sort(begin, end); 

    return EXIT_SUCCESS; 
} 

但是它無法編譯,給了以下錯誤:

  • 錯誤C2666「SpanIterator: :operator - ':2 overloads
  • Error C2780'void std :: _ Sort_unchecked1(_RanIt,_RanIt,_Diff,_Pr &)': 預計4個參數 - 3提供

如果我刪除SpanIterator operator-(const std::ptrdiff_t& movement)我得到不同的錯誤:

  • '無效的std :: _ Guess_median_unchecked(_RanIt,_RanIt,_RanIt,_Pr &)': 無法推斷出模板爭論從 '詮釋'
  • '_Guess_median_unchecked' _RanIt':沒有匹配的重載函數發現
  • 錯誤C2100非法間接

回答

4

你缺少運營商支持的following operations(其中ab是你的迭代器類型SpanIterator<...>的值):剩餘比較

  • b - a
  • a < b(和,雖然大多數std::sort唐實現」不要使用它們)。

例如,您可以提供以下成員運算符重載:

std::ptrdiff_t operator-(SpanIterator const&) const; 
bool operator<(SpanIterator const&) const; 
// etc. 

(請注意,非成員重載常常是優選:Operator overloading

此外,您operator bool應該是explicit以避免a + n,n + ab - a操作(其中n是您的差異類型的值,即std::ptrdiff_t)的模糊過載。

+0

顯式添加'operator bool'並添加您提到的兩個操作符已經完成了這個訣竅 - 謝謝您的友好:-) – keith

相關問題