微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果不推荐使用 std::iterator,我们是否仍应使用需要 std::iterator 的类或函数?

如何解决如果不推荐使用 std::iterator,我们是否仍应使用需要 std::iterator 的类或函数?

我听说 std::iterator 在 C++17 中已被弃用。

例如,像 <algorithm> 中的函数,我们更有可能使用返回迭代器的对象的 begin()end() 成员函数,例如 std::stringstd::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 举报,一经查实,本站将立刻删除。