v.end()指向哪里?

时间:2011-12-06 07:17:17

标签: c++ for-loop iterator sequence

for (vector<Student_info>::const_iterator iter = students.begin();
     iter != students.end(); ++iter)
    cout << (*iter).name << endl;

在Accelerated C ++中,上面的代码被告知输出向量中包含的所有数据,但如果循环在iter != students.end()等于students.end()时停止,那么它将如何进行到最后向量的元素?

5 个答案:

答案 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