STL C ++中的过去迭代器是什么?

时间:2013-03-06 15:54:34

标签: c++ stl

任何人都可以解释past-the-end的含义是什么。为什么我们将end()称为过去结束?

5 个答案:

答案 0 :(得分:35)

函数begin()end()定义了 半开放范围([begin, end) ,这意味着:
范围包括第一个元素但不包括最后一个元素。因此,名称超过了结束。

enter image description here

半开放范围的优点是:

  1. 避免对空范围进行特殊处理。对于空范围,begin()等于 end()

  2. 它使得遍历元素的循环的结束标准变得简单:循环简单 只要未达到end()

  3. ,就会继续

答案 1 :(得分:6)

因为它没有指向容器的 last 元素,而是指向过去某个容器的最后一个元素。

如果您取消引用end(),则会导致未定义的行为

答案 2 :(得分:5)

与数学中的间隔一样,stl使用[begin, end)

这就是为什么我们可以写for (auto it = v.begin(); it != v.end(); ++it)

答案 3 :(得分:2)

从字面上看,因为它指出了一个超过数组末尾的内容。

使用它是因为该元素为空,可以迭代但不能解除引用。

int arry[] = {1, 2, 3, 4, /* end */ };
                         ^^^^^^^
                    std::end(arry) would point here.

答案 4 :(得分:2)

在上述正确答案中添加另一点。 这也是为了与数组兼容。 例如,在下面的代码中:

char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);

这样可以正常工作。

相反,如果你给了:

sort(&arr[0], &arr[4]);

它会错过排序最后一个角色。

这也有助于自然地表示空容器。