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

C++ 如果std::iterator不推荐使用,我们是否仍应该使用需要std::iterator的类或函数?,c++,for-loop,iterator,c++17,C++,For Loop,Iterator,C++17,我听说std::iterator在C++17中被弃用 例如,像中的函数一样,我们更可能使用返回迭代器的对象的开始()和结束()成员函数,比如std::string,std::vector,等等 或者类似于基于范围的for循环,我们需要begin()和end()这两个函数也返回迭代器 因此,如果不推荐使用std::iterator作为基类,我们甚至应该使用begin()和end()等成员函数,还是使用STL中需要迭代器的其他函数 例如,像 中的函数都不需要std::iterator。尽管不赞成使用

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

例如,像
中的函数一样,我们更可能使用返回迭代器的对象的
开始()
结束()
成员函数,比如
std::string
std::vector
,等等

或者类似于基于范围的for循环,我们需要
begin()
end()
这两个函数也返回迭代器

因此,如果不推荐使用
std::iterator
作为基类,我们甚至应该使用
begin()
end()
等成员函数,还是使用STL中需要迭代器的其他函数

例如,像

中的函数都不需要
std::iterator
。尽管不赞成使用
std::iterator
,但使用它们还是可以的

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

所有这些都不需要使用
std::iterator

它还返回迭代器

迭代器没有被弃用。类模板
std::iterator
已弃用

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

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


所以像
std::vector::iterator
这样的对象/类内部的迭代器不是从
std::iterator
继承的

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



std::iterator
用于用作自定义迭代器的基类。除非您定义了一个自定义迭代器,否则您一开始就不会使用它。如果要定义自定义迭代器,则不应再使用
std::iterator
。请注意,出于这个目的,从来没有必要使用
std::iterator

std::iterator
的反对纯粹是反对将其用作基类

使用
begin()
end()
以及迭代器通常根本不受此影响

基本上,这意味着当您定义迭代器时,您应该有如下内容:

模板
类my_迭代器{
//以下名称是“std::iterator”为您定义的名称:
使用迭代器\u category=std::forward\u迭代器\u标记;
使用值_type=T;
使用reference=T&;
使用指针=T*;
使用差分类型=std::ptrdiff\t;
// ...
};
…而不是:

模板
类my_迭代器:public std::iterator{
// ...
};
这也意味着标准库中的迭代器的实现方式与标准库中的迭代器基本相同(大多数情况下都是这样,但根据您的阅读方式,有一种观点认为,标准的较旧版本至少意味着应该通过继承
std::iterator
来实现迭代器)


既然您提到了
begin()
end()
,我想应该添加一个不相关的点:通常最好使用
std::begin()
std::end()
而不是各种集合类的成员函数。通过这样做,您的代码可以使用内置数组,而不仅仅是将
begin()
end()
定义为成员函数的类。但这与不推荐使用的
std::iterator
完全无关。

std::iterator
是迭代器的构建块。它不是有效的迭代器,而且绝对不是迭代器。迭代器的概念并没有被放弃。C++库中没有“类或函数”,需要<代码> STD::迭代器< /> >。没有一个作为一个概念,有些类和函数通常使用迭代器,但这与
std::iterator
没有任何关系


无论如何,您可能从未使用过
std::iterator
,因为从用户角度来看,它的唯一用途是实现自定义迭代器。。。因此,只有在实现自定义迭代器并选择从
std::iterator
派生它们时,您才会有意地使用它。标准库可以自由使用它认为合适的
std::iterator
,但是这是在实现细节中,C++中没有任何期望,C++库提供的各种迭代器实际上都会使用<代码> STD::迭代器< /C> >。我猜真正的问题是:你曾经使用过<代码> STD::迭代器< /代码>吗?如果你对所有你曾经写过的C++代码进行了格式化,你能找到多少个例子:<代码> STD::迭代器< /C> >(文字、精确文本)?我敢打赌,您从未使用过它,它之所以被弃用,正是因为它基本上是不必要的,而且部分令人困惑。因此对象/类内部的迭代器,如
std::vector::iterator
不是从
std::iterator
继承的?它们不需要从
std::iterator
继承。在完全从C++标准中移除之前,他们可以从它继承,或者它们不可能继承。他们是否这样做无关紧要。