2017-10-16 176 views
-1

我是C++新手。我有這個代碼:VECTOR初始化C++

int main() 
{ 
    vector<int> a = { 1,2,3,4,5,6 }; 

    vector<int> b(&a[0], &a[5]); // what's wrong? Is it completely wrong this way? 

    for (int i = 0; i < 6; i++) { 
     cout << b[i] << endl; 
    } 
    return 0; 
} 

我知道正確的方法。 請告訴我b [5]在哪裏以及爲什麼我無法在此代碼中訪問它。

+0

'&A [0]' - >'a.begin()'&'&A [5]' - >'a.end()' – George

+0

您沒有指派它。 – 2017-10-16 20:04:49

+1

'我<6;'你爲什麼要用神奇數字?一個向量知道它的大小,而b的大小不是6! – 2017-10-16 20:06:17

回答

3
vector<int> b(&a[0], &a[5]); 

這類建築的使用爲std::vector的基於迭代器的構造函數(它能夠僅僅使用指針,但不建議這樣做,因爲迭代器封裝它們的執行和可能的行爲怪癖,並且通常是安全的) 。 Iterator構造函數需要兩個迭代器,一個開始,一個結束。你傳遞的是開始和結束,這意味着新的向量的構造範圍小於原始的大小。

如果你致力於爲這個語法,正確的方式來寫這將是

vector<int> b(a.begin(), a.end()); 

如果你只是想複製的載體,雖然,這是不必要的。您應該只是賦值運算符複製:

vector<int> b = a; //b is now a copy of a, using its own memory 

如果你想複製一個向量的一個子集,使用實際的迭代器:

vector<int> b(a.begin() + 2, a.begin() + 5);//Copies a[2], a[3], a[4] into a vector of size 3. 
3

結束迭代器是一個過去你想要的範圍內的最後一個項目。你可以說&a[6],但你最好使用容器的內置迭代器,如vector<int> b(a.begin(), a.end());

更好的是,vector<int> b {a};使用了複製構造函數,所以你不必放棄使用迭代器或指針。

1

範圍在C++的形式指定

[first, last) 

右括號而不是方括號表示可接受的值不包括值last

因此,在此聲明

vector<int> b(&a[0], &a[5]); 

的指針(迭代)的可接受範圍是[&a[0], &a[5])即值由指針&a[5]不會在矢量b的初始化被用於指向。該向量將只有5個元素等於a[0], a[1], a[2], a[3] and a[4]

所以使用這種循環

for (int i = 0; i < 6; i++) { 
    cout << b[i] << endl; 
} 

結果不確定的行爲神奇的數字6。

你可以寫例如

for (size_t i = 0; i < b.size(); i++) 
{ 
    std::cout << b[i] << std::endl; 
}  

或只是

for (auto x : v) std::cout << x << std::endl; 

這是明顯,這將是簡單的初始化向量b類似

vector<int> b(a); 

但是,如果你想指定矢量a的一些範圍作爲矢量的初始值那麼你可以寫例如

#include <iterator> 

//... 

vector<int> b(a.begin(), std::next(a.begin(), 6));