2010-08-20 182 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解釋「一個過去的結束」