gpt4 book ai didi

c++ - 为什么以下自定义迭代器实现不能很好地与 `std::all_of` 配合使用?

转载 作者:行者123 更新时间:2023-12-03 06:51:00 24 4
gpt4 key购买 nike

我正在研究一些需要包装另一个迭代器的迭代器类型。由于某种原因,自定义迭代器没有很好地定义。例如,与 std::all_of 一起使用时不会编译。 ,提示对 std::iterator_category 的函数调用不匹配:

/opt/.../stl_algo.h:108:32: error: no matching function for call to '__iterator_category(Iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >&)'
108 | std::__iterator_category(__first));
自定义迭代器公开了一个公共(public) iterator_category类型,所以我不确定这里有什么问题。为了演示这个问题,自定义迭代器简单地包装了一些其他迭代器类型:
#include <functional>
#include <iterator>
#include <vector>

template<typename It>
struct Iterator
{
using difference_type = typename std::iterator_traits<It>::difference_type;
using value_type = typename std::iterator_traits<It>::value_type;
using pointer = value_type*;
using reference_type = value_type&;
using iterator_category = std::input_iterator_tag;

Iterator(It it) : it_{it} {}

friend bool operator==(const Iterator& x, const Iterator& y) { return x.it_ == y.it_; }
friend bool operator!=(const Iterator& x, const Iterator& y) { return !(x == y); }

Iterator& operator++()
{
++it_;
return *this;
}
Iterator operator++(int)
{
Iterator it{*this};
this->operator++();
return it;
}

reference_type operator*() { return *it_; }

private:
It it_;
};

int main()
{
std::vector<int> v{1, 2, 3};

auto first{Iterator{v.begin()}};
auto last{Iterator{v.end()}};
std::all_of(first, last, [](auto) { return true; });
}
如果迭代器源自 std::iterator,编译器错误将得到解决:
struct Iterator : public std::iterator<std::input_iterator_tag, typename It::value_type>
(见: https://godbolt.org/z/vMfj38)
所以 std::iteratorIterator 的定义中缺少的东西带到表中。上面,但是什么?

最佳答案

std::iterator_traits 需要 reference成员类型,不是 reference_type .修复它允许它成功编译:

using reference/*_type*/ = value_type&;
...
reference/*_type*/ operator*() { return *it_; }
https://godbolt.org/z/PzK9fq

关于c++ - 为什么以下自定义迭代器实现不能很好地与 `std::all_of` 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64834658/

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