C ++:使用const和STL迭代器
从Effective C ++,第3项
/* case1 */ const std::vector<int>::iterator i // i acts like a T* const
/* case2 */ std::vector<int>::const_iterator ci // ci acts like a const T*
要记住const
如何应用,我曾经记得本文中的以下内容
基本上'const'适用于任何事情
就在它的左边(除了
如果那里什么也没有
它适用于它的任何情况
直接右)。
当我首先阅读书中的第3项时,我预计它将在case1和case2中反过来。
我应该把这个案子当作例外吗?或者是否有一些我缺失的更深层次的理解?
没有找到相关结果
已邀请:
5 个回复
抹持奠糙驰
右边的项目是
:迭代器是不可变的。你不能指定迭代器指向向量中的不同项,你不能递增它,它总是指向它被初始化的项。但是,您可以更改指向的项目。 这很少是期望的行为,这就是
typedef存在的原因。
迭代器可以四处移动,但指向的项目无法修改。这几乎总是你想要的 - 你想迭代一个向量但不能修改它的内容。 这里没有
关键字,因此您无法使用该规则来解决问题。对于这个,你只需要了解documented4ѭ的记录。
春驹晴陪
当您将
添加到其中任何一个时,它将应用于顶层,即指针本身,而不是指向的对象,因此以下等效项包含:
它们也不例外;这就是所有
的工作方式。
芳菱挨啡
关键字。但是,在处理迭代器时,
类仅被命名为(它可能同样为
),因此关于
关键字的规则不适用。 但是,您可以像这样声明案例1:
就像你可以指定
或
。 迭代器指向的类型也在其容器的模板参数中指定,因此排序与声明普通变量不同。 我无法看到这里有任何特定的经验法则 - 你的帖子中的评论是正确的想法,你只需要学会将
视为
等等。
香腔弥胯瓤
浩挎
适用于迭代器,因此它使迭代器本身成为常量。它对迭代器“指向”的项没有任何影响。 (这就像
,指针是
,而不是指向
) 在案例2中,
只是名称
的一部分,因此无法真正推断出
是什么。这个类可能只有一个坏名字,根本就没有关于它的const。但是,在这种情况下,
不允许修改它的目标元素,因为它的定义与标准库中的相同。