设为首页 加入收藏

TOP

4.3.3 循环访问向量
2013-10-07 14:44:41 来源: 作者: 【 】 浏览:51
Tags:4.3.3 循环 访问 向量

4.3.3  循环访问向量

接下来,程序循环访问了向量的内容,并且显示了主人公的物品栏:

  1. cout << "Your items:\n";  
  2. for (iter = inventory.begin(); iter != inventory.end(); ++iter)  
  3. {  
  4. cout << *iter << endl;  
  5. }  

上面的代码使用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之前,这样就可以显示该迭代器引用的元素(不是迭代器自身)的值。这样做相当于在告诉程序:"将它当做迭代器引用的内容来对待,而不是迭代器自身。"

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.2.7 调用元素的成员函数 下一篇4.2.6 向量的索引

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: