任何人都可以解释past-the-end
的含义是什么。为什么我们将end()
称为过去结束?
答案 0 :(得分:35)
函数begin()
和end()
定义了 半开放范围([begin, end)
) ,这意味着:
范围包括第一个元素但不包括最后一个元素。因此,名称超过了结束。
半开放范围的优点是:
避免对空范围进行特殊处理。对于空范围,begin()
等于
end()
。
它使得遍历元素的循环的结束标准变得简单:循环简单
只要未达到end()
答案 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]);
它会错过排序最后一个角色。
这也有助于自然地表示空容器。