4.3.3 循环访问向量
接下来,程序循环访问了向量的内容,并且显示了主人公的物品栏:
- cout << "Your items:\n";
- for (iter = inventory.begin(); iter != inventory.end(); ++iter)
- {
- cout << *iter << endl;
- }
上面的代码使用for循环从inventory的第一个元素访问到最后一个。总体而言,其循环访问向量内容的方式和程序Hero's Inventory 2.0中的相同。但Hero's Inventory 2.0程序的访问方法是使用一个整数和下标运算符,而此处用到了迭代器。基本上,就是把便签在整个元素序列上移动了一遍,并且显示了便签标记的每个元素的值。该循环虽小,但新的概念较多,下面对这些概念一一进行讲解。
1. 调用向量成员函数begin()
循环的初始化语句将inventory.begin()的返回值赋给iter。成员函数begin()返回的迭代器引用容器中的第一个元素。所以在本例中,该语句将引用inventory第一个元素(等于"sword"的string对象)的迭代器赋值给iter。图4-3抽象地表示了调用inventory.begin()返回的迭代器(注意,此图只是抽象的表示,因为向量inventory不包含字符串字面值"sword"、"armor"和"shield",而是包含string对象)。
|
| 图4-3 调用inventory.begin()返回的迭代器引用向量中第一个元素 |
2. 调用向量成员函数end()
此循环的测试表达式比较了inventory.end()的返回值和iter,以确保两者不相等。end()成员函数返回容器中最后一个元素之后的一个迭代器。即循环将继续下去,直到iter经过了inventory中的所有元素。图4-4抽象地表示了调用该成员函数返回的迭代器(注意,此图只是抽象的表示,因为向量inventory不包含字符串字面值"sword"、"armor"和"shield",而是包含string对象)。
|
| 图4-4 调用inventory.end()返回向量中最后一个元素之后的迭代器 |
陷阱
vector的成员函数end()返回的迭代器指向向量中最后一个元素之后-- 而不是最后一个元素。因此,无法从end()返回的迭代器获得元素值。这可能看起来有悖直观,但是能很好地用于遍历容器的循环之中。
3. 迭代器的更新
循环中的行为表达式++iter对iter进行递增操作,即将它从向量中的一个元素移动到下一个元素。视迭代器而定,还可以对它进行其他数学运算来使其在容器中移动。然而在大多数情况下,您会发现只需要递增操作。
4. 迭代器的解引用
程序在循环体中将 *iter发送给cout。将解引用运算符 * 置于iter之前,这样就可以显示该迭代器引用的元素(不是迭代器自身)的值。这样做相当于在告诉程序:"将它当做迭代器引用的内容来对待,而不是迭代器自身。"