25

任何人都可以解释我是什么意思past-the-end。为什么我们称end()函数为过去式?

4

5 回答 5

50

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

在此处输入图像描述

半开范围的优点是:

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

  2. 它使迭代元素的循环的结束标准变得简单:只要end()没有达到,循环就会继续

于 2013-03-06T16:03:36.627 回答
7

因为它不指向容器的最后一个元素,而是指向容器最后一个元素之后的某个位置。

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

于 2013-03-06T15:55:33.790 回答
5

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

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

于 2013-03-06T16:01:23.167 回答
2

从字面上看,因为它指向数组末尾之后的位置。

使用它是因为该元素是空的,并且可以迭代,但不能取消引用。

int arry[] = {1, 2, 3, 4, /* end */ };
                         ^^^^^^^
                    std::end(arry) would point here.
于 2013-03-06T15:55:30.530 回答
2

对上述正确答案再补充一点。这样做也是为了与数组兼容。例如在下面的代码中:

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

这将正常工作。

相反,如果你给了:

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

它会错过排序最后一个字符。

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

于 2013-03-06T16:09:37.967 回答