gpt4 book ai didi

c++11 - 实现自定义迭代器以与std::sort一起使用

转载 作者:行者123 更新时间:2023-12-02 09:24:59 25 4
gpt4 key购买 nike

我的目的是学习如何从头开始编写自定义迭代器。我编写了以下迭代器:

#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重载
  • 错误C2780'无效std::_ Sort_unchecked1(_RanIt,_RanIt,_Diff,_Pr&)':
    需要4个参数-提供了3个

  • 如果删除 SpanIterator operator-(const std::ptrdiff_t& movement),则会收到不同的错误:
  • 'void std::_ Guess_median_unchecked(_RanIt,_RanIt,_RanIt,_Pr&)':
    无法从``int''
  • 推导``_RanIt''的模板参数
  • '_Guess_median_unchecked':找不到匹配的重载函数
  • 错误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 + nn + ab - a操作的模棱两可的重载(其中 n是您的差异类型的值,即 std::ptrdiff_t)。

    关于c++11 - 实现自定义迭代器以与std::sort一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563716/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com