什么是迭代器? 这个问题是在我尝试用cTor编写C++类模板时,它接受了“一般迭代器”。我不知道在这里使用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器

什么是迭代器? 这个问题是在我尝试用cTor编写C++类模板时,它接受了“一般迭代器”。我不知道在这里使用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器,c++,iterator,c++2a,C++,Iterator,C++2a,换句话说,我对迭代器感到困惑。似乎所有STL容器都有相同的迭代器类型,那么该类型是什么?只是指针吗?还是更复杂的?但STL容器不接受普通指针 (我想把它与 Iterator >代码> java < /COD>,这是非常简单的,只是一个类)< p>在C++中,迭代器< /St>是一个概念,不是具体的(或抽象的)类型,而是 >任意< /强>类型,遵循某些迭代器规则。 例如,迭代器通常可以递增++i。可以访问(取消引用)*i以获取它们当前指向的值。它们本质上是指针的抽象 在标准库的容器和算法中,存在

换句话说,我对迭代器感到困惑。似乎所有STL容器都有相同的迭代器类型,那么该类型是什么?只是指针吗?还是更复杂的?但STL容器不接受普通指针


<>(我想把它与<代码> Iterator <代码> >代码> java < /COD>,这是非常简单的,只是一个类)

< p>在C++中,<强>迭代器< /St>是一个概念,不是具体的(或抽象的)类型,而是<强> >任意< /强>类型,遵循某些迭代器规则。
例如,迭代器通常可以递增
++i
。可以访问(取消引用)
*i
以获取它们当前指向的值。它们本质上是指针的抽象

在标准库的容器和算法中,存在具有不同属性的不同类型的迭代器。其属性如下所示:

< >当在C++中编写接受迭代器的算法时,通常只接受泛型模板参数并在函数中使用适当的迭代器属性。如果用户向函数传递的内容不符合迭代器规则,编译器将对此进行投诉:

template<typename Iterator>
void my_algorithm(Iterator begin, Iterator end)
{
    for(; begin != end; ++begin)
        std::cout << *begin << '\n';
}
模板
void my_算法(迭代器开始、迭代器结束)
{
for(;begin!=end;++begin)

迭代器是一种行为设计模式,被称为“四人帮设计模式”的一部分。它解决了在聚合对象中迭代对象而不知道该对象的内部结构的问题

有关迭代器模式的更多详细信息,请参阅以下内容:

< P>迭代器作为一个概念来自于C++之前的一个标准。 C++一开始是C语言,有很多类,增加了更多的功能,越来越多的人对C语言感兴趣

其中一项非常重要的工作是STL——标准模板库——最初由Stepanov和Lee编写,1994年在惠普公司完成,后来由SGI维护

该库采用C++的模板元编程部分,以革命性的方式编写,允许抽象的类型接近裸金属性能,算法实现与容器实现脱离,几乎是任意类型。 迭代器是一个概念——一种更高级的类型 <>在其中,迭代器是一个概念。C++中的概念是一个类型的类型(可以说是一种类型)。C++中的概念不是由编译器强制执行的(此时)。 如果类型具有所需的操作,并且这些操作遵守该概念的规则,则该类型满足该概念

< STL >和C++标准后面的迭代器概念有一个层次结构,它们从最小限制(迭代器)到最多(读写随机访问的连续迭代器),并形成树。 模板函数写函数

当模板算法要求迭代器时,他们要求满足迭代器概念的类型(如C++标准中所描述的)。当他们请求一个RandomAccessIterator时,他们要求一个满足随机访问迭代器概念的类型。(其中还包括迭代器概念、ForwardIterator概念和其他一些概念)

因此
template void std::sort(ForwardIterator,ForwardIterator)
是一个模板函数,它接受满足ForwardIterator概念的相同类型的两个实例

转发器迭代器必须支持许多操作(
*it
++it
bool b=it!=it
bool b=it==it
,等等),支持某些特征(
iterator\u traits::iterator\u category
iterator\u traits::reference
iterator\u traits::value\u type
,等等),这些操作必须遵循某些规则

如果为其提供一个满足RandomAccessIterator的类型,
std::sort
比传递一个
ForwardIterator
保证更好的性能

原始指针满足前向随机访问迭代器和前向随机访问迭代器的要求,而无需执行任何操作。
std::vector::iterator
也满足这两种要求,但通常不是原始指针(std库做了一些工作)

这两种类型——原始指针和
std::vector::iterator
——通常是不相关的类型。C++的模板和traits系统允许不相关的类型被相同的模板算法理解,并且运行时开销为零

年,有计划引入语言概念,实际检查一些需求,如RandomAccessIterator,并用langauge记录其他实际上无法检查的需求

C++不是一种面向对象语言 <>你可能被用于面向对象语言的困惑。C++支持面向对象编程,但不是面向对象语言。它支持多态性——处理多个类型相同的-没有基于对象的继承。 在面向对象语言中,每个迭代器都将继承抽象迭代器类型。算法将通过该抽象接口与迭代器交互,通常通过某种虚拟函数表分派调用。不可能使用该类型的值,因为算法代码将在不知道字节数的情况下编译迭代器占用空间,因此会发生额外的间接寻址

<>在C++中,算法不是函数,直到传递迭代器的类型。在那个时候,函数是为迭代器定制的。C++标准声明,如果迭代器做某些事情(遵循所需的概念),则函数由