Jac*_*row 9 c++ iterator for-loop c++17
我听说std::iterator在 C++17 中不推荐使用。
例如,像功能<algorithm>,更可能我们要使用begin()和end()它返回迭代器对象,如成员函数std::string,std::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纯粹是弃用它作为基类。
使用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被弃用完全无关。