如何解决如果不推荐使用 std::iterator,我们是否仍应使用需要 std::iterator 的类或函数?
我听说 std::iterator
在 C++17 中已被弃用。
例如,像 <algorithm>
中的函数,我们更有可能使用返回迭代器的对象的 begin()
和 end()
成员函数,例如 std::string
, std::vector
等
或者像基于范围的 for 循环一样,我们需要 begin()
和 end()
来返回迭代器。
因此,如果 std::iterator
作为基类被弃用,我们是否应该使用像 begin()
和 end()
这样的成员函数,还是使用 STL 中需要迭代器的其他函数?
解决方法
例如,像 <algorithm>
中的函数
<algorithm>
中的任何函数都不需要 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()
和 end()
以及迭代器一般不受此影响。
基本上,所有这些都是说当你定义一个迭代器时,你应该有这样的东西:
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;
// ...
};
...而且不是:
template <class T /* .. */>
class my_iterator : public std::iterator<std::forward_iterator_tag,T> {
// ...
};
这也意味着标准库中的迭代器旨在以几乎相同的方式完成(它们大部分都是如此,但取决于您如何阅读它,有一个论点认为旧版本的标准至少暗示它们也应该通过继承 std::iterator
来实现)。
既然您提到了 begin()
和 end()
,我认为值得添加一个无关的点:通常使用 std::begin()
和 std::end()
而不是各种收藏类。通过这样做,您的代码可以使用内置数组,而不仅仅是将 begin()
和 end()
定义为成员函数的类。但这与 std::iterator
被弃用完全无关。
std::iterator
是一个迭代器构建块。它不是一个有效的迭代器,绝对不是 迭代器。迭代器的概念绝不会被放弃。 C++ 库中没有需要 std::iterator
的“类或函数”。没有任何。有一些类和函数通常使用迭代器作为一个概念,但这与 std::iterator
没有任何关系。
无论如何,您可能从未使用过 std::iterator
,因为从用户角度来看,它的唯一用途是实现自定义迭代器...因此,如果您实现了自定义迭代器 和 选择从 std::iterator
派生它们。标准库可以自由地使用它认为合适的 std::iterator
,但这是在实现细节中,C++ 标准中没有期望 C++ 库提供的各种迭代器中的任何一个实际上会使用 {{1} }.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。