【发布时间】:2013-02-21 12:26:58
【问题描述】:
任何人都可以向我解释past-the-end 的含义。为什么我们称end() 函数为过去式?
【问题讨论】:
任何人都可以向我解释past-the-end 的含义。为什么我们称end() 函数为过去式?
【问题讨论】:
从字面上看,因为它指向数组末尾的一个位置。
使用它是因为该元素是空的,并且可以迭代,但不能取消引用。
int arry[] = {1, 2, 3, 4, /* end */ };
^^^^^^^
std::end(arry) would point here.
【讨论】:
end 迭代器指向目标序列的末尾,而不管迭代器来自哪里或值保存在哪里。
因为它不指向容器的last元素,而是指向过去容器的最后一个元素的某处。
如果您取消引用end(),则会导致未定义的行为。
【讨论】:
和数学中的区间一样,stl 使用[begin, end)。
这就是为什么我们可以写for (auto it = v.begin(); it != v.end(); ++it)
【讨论】:
[begin,end]也是如此;然后还有(a,b]、(a,b)。请详细说明,与其他区间相比,您在数学中看到 [a,b) 有什么特别之处?
函数begin() 和end() 定义了一个半开范围([begin, end)),这意味着:
该范围包括第一个元素但不包括最后一个元素。因此,名称超过了结尾。
半开范围的优点是:
它避免了对空范围的特殊处理。对于空范围,begin() 等于
end().
它使迭代元素的循环的结束标准变得简单:循环简单
只要没有到达end(),就继续
【讨论】:
begin()和end();通常,[begin, end) 定义了一个值的序列,而不管迭代器来自哪里或值保存在哪里。
end - begin(用于随机访问迭代器),而不是带有令人讨厌的 +1 的表达式。
对上述正确答案再补充一点。 这样做也是为了与数组兼容。 比如下面的代码:
char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);
这会很好用。
如果你给了:
sort(&arr[0], &arr[4]);
它会错过排序最后一个字符。
这也有助于自然地表示空容器。
【讨论】: