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中反过来。 我应该把这个案子当作例外吗?或者是否有一些我缺失的更深层次的理解?     
已邀请:
该规则与宣传的一样有效。
const std::vector<int>::iterator i
右边的项目是
iterator
:迭代器是不可变的。你不能指定迭代器指向向量中的不同项,你不能递增它,它总是指向它被初始化的项。但是,您可以更改指向的项目。 这很少是期望的行为,这就是
const_iterator
typedef存在的原因。
std::vector<int>::const_iterator ci
迭代器可以四处移动,但指向的项目无法修改。这几乎总是你想要的 - 你想迭代一个向量但不能修改它的内容。 这里没有
const
关键字,因此您无法使用该规则来解决问题。对于这个,你只需要了解documented4ѭ的记录。     
您可以认为它就好像迭代器是这样的:
typedef T* iterator;
typedef const T* const_iterator;
当您将
const
添加到其中任何一个时,它将应用于顶层,即指针本身,而不是指向的对象,因此以下等效项包含:
const iterator it; // is the same as:
T* const it;

const const_iterator it; // is the same as:
const T* const it;
它们也不例外;这就是所有
typedef
的工作方式。     
引用的规则绝对适用于
const
关键字。但是,在处理迭代器时,
const_iterator
类仅被命名为(它可能同样为
readonly_iterator
),因此关于
const
关键字的规则不适用。 但是,您可以像这样声明案例1:
std::vector<int>::iterator const i
就像你可以指定
const int x
int const x
。 迭代器指向的类型也在其容器的模板参数中指定,因此排序与声明普通变量不同。 我无法看到这里有任何特定的经验法则 - 你的帖子中的评论是正确的想法,你只需要学会将
const_iterator
视为
const T*
等等。     
我认为const_iterator让你很困惑。这是一个更简单的typedef的例子。
typedef int* Type;
typedef const int* ConstType;

int main() {
  const Type a; // int * const
  ConstType b; // const int *
}
    
情况1中的
const
适用于迭代器,因此它使迭代器本身成为常量。它对迭代器“指向”的项没有任何影响。 (这就像
T* const
,指针是
const
,而不是指向
T
) 在案例2中,
const
只是名称
const_iterator
的一部分,因此无法真正推断出
const
是什么。这个类可能只有一个坏名字,根本就没有关于它的const。但是,在这种情况下,
const_iterator
不允许修改它的目标元素,因为它的定义与标准库中的相同。     

要回复问题请先登录注册