实现自定义迭代器以使用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(其中a
和b
是你的迭代器类型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 + a
和b - a
操作(其中n
是您的差异类型的值,即std::ptrdiff_t
)的模糊过载。
显式添加'operator bool'并添加您提到的两个操作符已经完成了这个诀窍 - 谢谢您的友好:-) – keith