4.3.2 迭代器的声明
程序为主人公的物品栏声明了一个向量,然后添加与之前程序相同的3个string对象。在此之后,又声明了一个迭代器。
- vector<string>::iterator myIterator;
这行代码为包含string对象的向量声明了一个名为myIterator的迭代器。如果要声明自己的迭代器,按照下面的模式操作:先写下容器类型,接着是容器包含的对象的类型(用<和>括起来),然后是作用域解析运算符(符号::),最后是iterator和新迭代器的名称。
那么何谓迭代器?迭代器是标识容器中某个特定元素的值。给定一个迭代器,可以访问元素的值;给定正确类型的迭代器,就可以修改其值。迭代器还可以通过常见的算术运算符在元素之间移动。
可以将迭代器想象成贴在容器中某个特定元素上的便签。迭代器虽然不是元素本身,但它是引用元素的一种方式。具体而言,我们可以使用myIterator引用向量inventory中的特定元素。即可将myIterator便签贴在向量inventory中的特定元素上。一旦贴上以后,就能够通过该迭代器访问甚至修改相应元素。
接下来,程序声明了另一个迭代器。
- vector<string>::const_iterator iter;
上面的代码为一个包含string对象的向量创建了名为iter的常量迭代器。除了不能用来修改其引用的元素以外,常量迭代器与常规迭代器几乎一样。由常量迭代器引用的元素必须保持不变。可以将常量迭代器想象成提供了只读访问权限。然而,迭代器自身可以改变。即如果需要,可以让iter在向量inventory之中移动。然而,无法通过iter修改任何元素的值。使用常量迭代器,便签的位置可以改变,但是被便签标记的元素不能改变。
如果常量迭代器是带限制的常规迭代器,为何还要使用它们?首先,这使程序的意图比较清晰。在使用常量迭代器时,很显然不需要修改它引用的元素。其次,这样更加安全。使用常量迭代器能够避免容器元素的意外修改(如果试图通过常量迭代器修改元素,编译器将会报错)。
陷阱
使用push_back()可能使引用向量的所有迭代器无效。
觉得这些关于迭代器的内容太抽象?或是厌烦了便签的比喻?不用担心,接下来我们将真正使用到迭代器。