for (vector<Student_info>::const_iterator iter = students.begin();
iter != students.end(); ++iter)
cout << (*iter).name << endl;
在Accelerated C ++中,上面的代码被告知输出向量中包含的所有数据,但如果循环在iter != students.end()
等于students.end()
时停止,那么它将如何进行到最后向量的元素?
答案 0 :(得分:3)
你写的循环大致相当于:
vector<Student_info>::const_iterator iter = students.begin();
while (iter != students.end()) {
cout << (*iter).name << endl;
++iter;
}
这是for
循环正常扩展到其while
等效 1 。每次循环时,iter
迭代器都会递增(使用++iter
)以前进到下一个元素。当达到向量的末尾时,iter
将等于students.end()
,循环将退出。
1。 iter
循环范围内for
的范围除外。
答案 1 :(得分:3)
end()
指向容器末尾的某个地方。按照惯例,C ++中的序列的格式为[begin, end)
,即末尾不序列的一部分。对于数组和向量,end()
指向的索引等于数组的大小(在数组或向量之外)。
这在许多方面都很方便。例如,对于空序列,容器的开头和结尾是相同的元素。此外,end()
返回的值通常用作“无效”迭代器,因为它不指向有意义的元素。
答案 2 :(得分:3)
end()
返回一个特殊值,表示“迭代结束,停止”。通常,这是数组末尾之外的元素的迭代器 - 您不必处理它,一旦到达它就应该停止,这就是循环的作用。
答案 3 :(得分:2)
如果我很清楚你所问的是什么,那是因为矢量的最后一个元素实际上位于v.end() - 1的位置。因此,对于v.end()之前的元素,循环应该停止访问所有元素。那是你问的吗?
答案 4 :(得分:1)
实际上.end()
不会将迭代器返回到 last 元素,而是将迭代器返回到 past-the-last-element 。最后一个元素的迭代器就在它之前;也就是说,如果it
指向最后一个元素,那么++it
会使it
指向过去的最后一个元素。
语言规范将其称为 past-the-end 迭代器。
§24.1/ 5(C ++ 03)读,
正如指向数组的常规指针一样,保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应容器的最后一个元素。这些值称为past-the-end值。定义表达式* i的迭代器i的值称为可解除引用。库永远不会假定过去的值是可解除引用的
另请注意,解除引用过去的迭代器会调用未定义的行为:
auto it = students.end(); //ok
it->someFunction(); //undefined behavior
(*it).someFunction(); //undefined behavior