gpt4 book ai didi

C++17 iterator_traits 没有被调用

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

在更改了一些功能之后,我对自定义的 C++17 迭代器很陌生。为了说明错误,以下是说明问题的极简代码。报错了

auto[min_it, max_it] = std::minmax_element(r.begin(), r.end());



哪个找不到

forward_iterator_tag



为什么会这样?我们如何解决它?非常感谢!!
#include <iostream>

class num_iterator {
public:
explicit num_iterator(int pos = 0) : i{pos} {};
int operator*() const {
return i;
}
num_iterator &operator++() {
++i;
return *this;
}
bool operator!=(const num_iterator &other) {
return i != other.i;
}
private:
int i;
};

class num_range {
public:
num_range(int from, int to) : a{from}, b{to} {};
num_iterator begin() {
return num_iterator{a};
}
num_iterator end() {
return num_iterator{b};
}
private:
int a{0};
int b{0};
};


namespace std {
template<>
struct iterator_traits<num_iterator> {
using iterator_cateory = std::forward_iterator_tag;
using value_type = int;
};
}

int main() {
for (int a:num_range(10, 20)) {
std::cout << a << " ";
}

num_range r{100, 110};

auto[min_it, max_it] = std::minmax_element(r.begin(), r.end());
std::cout << *min_it << std::endl;
std::cout << *max_it << std::endl;

return 0;
}

最佳答案

在这种特定情况下,编译器提示缺少 operator==。对于您的自定义迭代器:

  bool operator==(const num_iterator& other){
return !(*this != other);
}

另一个具体问题是您拼错了 iterator_category
using iterator_category = std::forward_iterator_tag;
一般来说,定义自己的迭代器并不总是那么简单。有许多必需的操作因您的迭代器类型而异。我建议使用 Boost.Iterator做对了。
counting iterator已经解决了你的问题。
前向迭代器需要您未提供的许多其他内容,例如:
  • 您缺少 pointer 的类型特征, difference_type ,以及 reference 的类型特征必须是 const T&
  • 您需要前缀和后缀增量运算符
  • 你需要两个operator==operator!= (如上所述)
  • 你也错过了operator->

  • Demo

    关于C++17 iterator_traits 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699632/

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