C++:使用const和STL迭代器

Laz*_*zer 2 c++ templates stl const effective-c++

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*
Run Code Online (Sandbox Code Playgroud)

为了记住如何const应用,我曾经记得本文中的以下内容

基本上'const'适用于其左边的任何东西(除非没有任何东西,在这种情况下它适用于它的直接权利).

当我第一次阅读本书中的第3项时,我预计它将在case1和case2中反过来.

我应该把这个案子当作例外吗?或者是否有一些我缺失的更深层次的理解?

Joh*_*ica 8

该规则与宣传的一样有效.

const std::vector<int>::iterator i
Run Code Online (Sandbox Code Playgroud)

右边的项目是iterator:迭代器是不可变的.你不能指定迭代器指向向量中的不同项,你不能递增它,它总是指向它被初始化的项.但是,您可以更改指向的项目.

这很少是期望的行为,这就是const_iteratortypedef存在的原因.

std::vector<int>::const_iterator ci
Run Code Online (Sandbox Code Playgroud)

迭代器可以四处移动,但指向的项目无法修改.这几乎总是你想要的 - 你想迭代一个向量但不能修改它的内容.

这里没有const关键字,因此您无法使用该规则来解决问题.对于这个,你只需要了解const_iterator记录的内容.


Jam*_*lis 5

您可以认为它就好像迭代器是这样typedef编辑的:

typedef T* iterator;
typedef const T* const_iterator;
Run Code Online (Sandbox Code Playgroud)

当您添加const到其中任何一个时,它将应用于顶层,即指针本身,而不是指向的对象,因此以下等效项包含:

const iterator it; // is the same as:
T* const it;

const const_iterator it; // is the same as:
const T* const it;
Run Code Online (Sandbox Code Playgroud)

它们也不例外; 这就是所有typedef的工作方式.