2010-08-20 121 views
2
const int NUMB = 4; 
int n[] = {5,6,7,8}; 

// create a vector of strings using the n[] array 
vector<int> partnums(n, n + NUMB); 

的类函数矢量名称(src.begin,src.end)初始化向量

创建从源容器 与 元件初始化矢量处开始的src .begin和 scr.end

据该书结尾,

载体partnums声明为 矢量int类型以及与从所述N个阵列 元件,与所述第一阵列元素n [0],并且 与最后一个数组元素结束, 位于起始 初始化位置n + NUMB。

我还是不明白。 “位于n + NUMB位置,是不是索引从0开始? 或者编译器知道这个src.end引用位置1(scr.begin),并且从数组n中的那个位置开始计数,并且计数到第四位置)?

谢谢

+0

概念由于我没有看到它的答案中说:那简直是在书中的错误。大多数编程教科书都有重大勘误,因此请始终相信您自己的观察结果和/或向我们提出要求:v)。 – Potatoswatter 2010-08-20 04:13:54

+0

在过去,我通过参考通常在网上发布的书籍的勘误来了解那些似乎是错误的概念。 – Chubsdad 2010-08-20 05:39:08

回答

6

C++标准库使用了一种惯例,即'结束'迭代器实际上指的是结束时的一个元素,因此在您的情况下,'begin'将是第0个位置,'end'是第四个(而不是第三个)位置。

上面引用中引起混淆的是n + NUMB被称为数组中的最后一个元素,这是不正确的。它是数组中最后一个元素之后的(虚构)元素,并且仅用作结束标记。

1

在n + NUMB是指向最后一个元素+ 1点或IOW一个超出阵列的尺寸的位置。

复制它开始以n时+ 0和副本到最后一个元素

4

cplusplus.com

将迭代器输入到序列中的初始位置和最终位置。使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包含last指向的元素。

n指向的数组的开始,和n + NUMB充当指针运算,从而有效地增加由nsizeof(int) * NUMB。因此n + NUMB指向数组的“结尾”(真的是数组之外的第一个地址)。由于在初始化程序中给出的“结束”是非包含,这涵盖了数组中的所有元素(索引0-3或索引0到(NUMB - 1)在一般情况下)。

3

我有这个发现的最好的文章是here解释“一个过去的结束”