实现自定义迭代器以使用std :: sort

实现自定义迭代器以使用std :: sort

问题描述:

我的目标是学习如何从头开始编写自定义迭代器。我写了下面的迭代器:实现自定义迭代器以使用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非法间接

你缺少运营商支持的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