迭代器是一个对象,可让您在集合或流中的每个对象上移动(或迭代)。它是指针的一种概括。也就是说,指针是迭代器的一个示例。
[当我们使用迭代器时,我们声明迭代器,然后将itr
作为对象,但是我们没有像每次每次声明指针变量时那样传递任何指针,而是当我们通过使用迭代器来打印vector的值时, itr
成为*itr
当我们不传递任何指针时
指针是隐藏的还是在后台工作?
示例:
iterator itr; *itr
*
是如何工作的,意味着迭代器或*itr
的其他任何行为都像普通指针变量一样。
如果它像指针变量一样工作,那么为什么在声明*
时不传递itr
。
[当我们使用迭代器时,我们先声明迭代器,然后将itr作为对象,但是我们不会像在每次声明指针变量时而是通过使用use打印向量的值时那样传递任何指针。]] >
迭代器是一个对象,可让您在集合或流中的每个对象上移动(或迭代)。它是指针的一种概括。也就是说,指针是迭代器的一个示例。
迭代器实现了各种算法所需的概念,例如正向迭代(意味着可以递增以在集合中向前移动),双向迭代(意味着可以向前和向后移动)以及随机访问(意味着您可以使用索引集合中的任意项目)。例如,向后移动通常不会在流中发生,因此流的迭代器通常仅是正向迭代器,这是因为一旦访问值,便无法返回流。链表的迭代器是双向的,因为您可以向前或向后移动,但由于节点通常不在连续内存中,因此无法通过索引访问它们,因此无法使用任意元素所在的索引进行计算。向量的迭代器是随机访问的,非常类似于指针。 (C ++ 20使these categories更精确,因此旧类别现在称为“旧版”。)
迭代器还可以具有特殊功能,例如std::back_inserter
,当将值分配给其引用对象时,该函数会将项目追加到容器的末尾。
因此,您可以看到迭代器使您可以更精确地定义迭代器使用者的期望。如果您的算法需要双向迭代,则可以对其进行通信并加以限制,以使其不适用于仅向前的迭代器。
关于*
运算符,它类似于指针的*
运算符。在两种情况下,它的意思是“给我此句柄引用的值”。它是通过操作员重载实现的。声明迭代器时不需要*
,因为它不是指针,这是该语言中的较低级构造。相反,它是一个具有指针式语义的对象。
在下面回答您的问题:
否,不会自动创建*
。声明迭代器时,您是在声明一个对象。定义该对象的类时,对于*
运算符(或==
或+
或任何其他运算符),它可能有也可能没有运算符重载。
[当您使用对象时,例如将其传递给函数时,类型需要匹配。如果要传递给它的函数需要迭代器(例如std::sort()
),则不需要取消引用*
。如果函数期望迭代器引用的类型的值,那么您将需要首先取消引用它。在那种情况下,编译器将调用重载运算符*
并返回该值。
这是重载运算符的性质-它们看起来像普通运算符,但最终被解析为由类创建者定义的函数调用。它的工作原理与您定义一个矩阵类的正负运算符重载的工作原理相同。
[它的工作方式*意味着迭代器或* itr的任何其他行为都像普通指针变量一样。
取决于iterator
后面的类型。它可以是指针的别名:
using iterator = int *; iterator itr; *itr; // it is pointer dereferencing in this case.
或者它可以是用户定义的类型:
struct iterator { int &operator*(); }; iterator itr; *itr; // it means itr.operator*() here
因此,不知道
iterator
的类型是什么,在这里很难说*
的实际作用。但是实际上,您不必在意,因为库的开发人员应该以对您来说不重要的方式来实现它。
迭代器是一个对象,可让您在集合或流中的每个对象上移动(或迭代)。它是指针的一种概括。也就是说,指针是迭代器的一个示例。
[它的工作方式*意味着迭代器或* itr的任何其他行为都像普通指针变量一样。