2013-03-06 55 views

回答

27

功能begin()end()定义半开区间([begin, end),这意味着:
范围包括第一个元素,但不包括最后一个元素。因此,这个名字结束了。

enter image description here

一个半开放范围的优点是:

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

  2. 这使得最终的标准简单为遍历元素的循环:该循环简单 只要继续end()没有达到

+2

+1很好的答案。 – Nawaz 2013-03-06 16:17:30

+0

插图闻起来像Josuttis :) – fredoverflow 2013-03-06 16:30:36

+1

不仅仅是'begin()'和'end()';一般来说,'[begin,end]'定义了一个**序列**的值,而不管迭代器来自何处或哪些值被保存。 – 2013-03-06 16:58:39

2

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

它被使用,因为那个元素是空的,并且可以迭代到,但不能被解除引用。

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

不只是数组;无论迭代器来自哪里或哪些值被保存,“end”迭代器都会指向目标序列的末尾。 – 2013-03-06 16:59:15

6

因为它并不指向容器的最后元素,但在某处过去容器的最后一个元素。

如果您解除引用end(),那么结果为未定义的行为

5

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

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

+1

是的!第一个不谈容器的答案,不需要创建序列。 – 2013-03-06 17:00:09

2

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

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

这将工作正常。

相反,如果你给了:

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

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

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