如果不推荐使用 std::iterator ,我们还应该使用需要 std::iterator 的类或函数吗?

Jac*_*row 9 c++ iterator for-loop c++17

我听说std::iterator在 C++17 中不推荐使用。

例如,像功能<algorithm>,更可能我们要使用begin()end()它返回迭代器对象,如成员函数std::stringstd::vector等等。

或者像基于范围的 for 循环,我们需要的地方begin()以及end()返回迭代器的地方。

因此,如果std::iterator基类被弃用,我们是否应该使用成员函数,如begin()end()或使用 STL 中需要迭代器的其他函数?

eer*_*ika 13

例如,像来自 <algorithm>

<algorithm>require 中没有任何功能std::iterator。尽管std::iterator.

我们更有可能使用 begin() 和 end() 成员函数

这些都不需要使用std::iterator.

也返回迭代器。

不推荐使用迭代器。std::iterator不推荐使用类模板。

我们甚至应该使用像 begin() 和 end() 这样的成员函数还是使用 STL 中需要迭代器的其他函数?

是的。尽管如此,我还是建议std::ranges在方便的时候使用它们(在 C++20 中)。

所以对象/类中的迭代器std::vector<int>::iterator不是从std::iterator?

标准库迭代器类型由标准库实现定义。从技术上讲,它们可以继承,std::iterator但不要求也不保证继承自它。无论它们是否继承std::iterator,它们本身都不会被弃用。


std::iterator过去打算用作自定义迭代器的基类。除非您正在定义自定义迭代器,否则您一开始就不会使用它。如果您正在定义自定义迭代器,则不应再使用std::iterator。请注意,从来没有必要std::iterator为此目的使用。

  • 它们不需要继承自“std::iterator”。在它从 C++ 标准中完全删除之前,它们可能会继承它,也可能不会。他们是否这样做并不重要。 (3认同)

Jer*_*fin 7

的弃用std::iterator纯粹是弃用它作为基类。

使用begin()andend()和迭代器一般不受此影响。

基本上,所有这些都是说当你定义一个迭代器时,你应该有这样的东西:

template <class T /* ... */>
class my_iterator {
    // the following names are what `std::iterator` defines for you:
    using iterator_category = std::forward_iterator_tag;
    using value_type = T;
    using reference = T&;
    using pointer = T*;
    using difference_type = std::ptrdiff_t;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

...而不是

template <class T /* .. */>
class my_iterator : public std::iterator<std::forward_iterator_tag, T> {
// ...
};
Run Code Online (Sandbox Code Playgroud)

这也意味着标准库中的迭代器旨在以几乎相同的方式完成(它们大部分都是如此,但取决于您如何阅读它,有一个论点认为旧版本的标准至少暗示它们应该是也通过继承实现std::iterator)。

既然你提到了begin()and end(),我认为值得添加一个不相关的点:通常使用std::begin()andstd::end()而不是各种集合类的成员函数更好。通过这样做,您的代码可以使用内置数组,而不仅仅是定义begin()end()作为成员函数的类。但这与std::iterator被弃用完全无关。