2

我是 C++ 新手,目前正在学习模板和迭代器。我看到了一些实现自定义迭代器的代码,我很想知道这两个iterator参数之间的区别是什么:

iterator & operator=(iterator i) { ...   i.someVar }
bool operator==(const iterator & i) { ... i.someVar }

他们为特定的迭代器实现 = 和 == 运算符。假设迭代器类有一个成员变量“someVar”,为什么一个运算符使用“iterator i”实现,另一个使用“iterator & i”实现?两个“i.someVar”表达式之间有什么区别吗?

我用谷歌搜索了一下,发现了这个问题 地址数组 - 有一个&符号和没有&符号的区别

答案是“数组被转换为指针,它的值是数组中第一个东西的地址。” 我不确定这是否相关,但这似乎是我能找到的唯一有效解释。

谢谢!

4

3 回答 3

3

operator=按值(也称为副本)获取其参数。operator ==通过 const 引用获取它的参数(也就是通过地址,尽管保证对象不会被修改)。

迭代器可能是/包含指向数组的指针,但它本身不是数组。

和号 ( &) 具有不同的上下文含义。在表达式中使用时,它的行为类似于运算符。在诸如 的声明中使用iterator & i,它构成类型的一部分,iterator &并表示它i是一个引用,而不是一个对象。

有关更多讨论(带图片!),请参阅C++ 中的按引用传递/值传递和按引用传递与按值传递有什么区别?(这个与语言无关)。

于 2013-11-06T00:32:38.670 回答
2

赋值运算符=将迭代器 i 作为值,这意味着制作原始迭代器的副本并将其传递给函数,因此在运算符方法内应用于迭代器的任何更改i都不会影响原始迭代器。

比较运算符==采用常量引用,这表示原始对象不能/不应该在方法中更改。这是有道理的,因为比较运算符通常只比较对象而不更改它们。引用允许将引用传递给位于方法之外的原始迭代器。这意味着不会复制实际对象,这通常更快。

于 2013-11-06T00:37:09.603 回答
1

首先,这里没有数组的地址。

没有语义差异,除非您尝试对局部变量进行局部更改iiterator i将允许局部更改,而const iterator & i不允许。

许多人习惯于const type & var为函数参数编写函数,因为通过引用传递可能比通过值传递更快,尤其是如果type复制大且复制成本高,但在您的情况下,aniterator应该小且复制成本低,因此避免复制没有任何好处. (实际上,拥有本地副本可以增强引用的局部性并帮助优化,所以我只会按值(通过复制)传递小值。)

于 2013-11-06T00:32:31.563 回答