2014-02-08 57 views
1

我被預期用意外行爲::運算=在C++

v2 = v1 

V1的內容被複制到V2。

我的經驗是,v1的內容是而不是複製到v2中,如果v1的內容未在構造函數中初始化。

只是看到代碼:

#include <iostream> 
#include <vector> 

using namespace std; 

int main (void) { 
    vector<int> v1; // if I use vector<int> v1(10,0); it just works fine 
    vector<int> v2; 
    v1.reserve(5); 
    v2.reserve(5); 
    for (int i = 0; i < 5; i++) v1[i] = i*i; 
    v2 = v1; 
    for (int i = 0; i < 5; i++) { 
    cout << "v1[" << i << "] = " << v1[i] << endl; 
    cout << "v2[" << i << "] = " << v2[i] << endl; 
    } 
    return 0; 
} 

執行的結果是:

v1[0] = 0 
v2[0] = 0 
v1[1] = 1 
v2[1] = 0 
v1[2] = 4 
v2[2] = 0 
v1[3] = 9 
v2[3] = 0 
v1[4] = 16 
v2[4] = 0 

爲什麼這種奇怪的行爲?

回答

7

你的期望是正確的。 v2 = v1;v1的所有元素複製到v2。問題是你正在訪問你的向量越界。這是未定義的行爲

std::vector::reserve不會增加它們的大小。它只是分配更多的存儲空間以根據需要增長。您需要改爲撥打std::vector::resize,將矢量初始化爲具有合適的大小,或者在循環中調用push_back

請注意,您應該使用size()成員變量,begin()end()迭代器或基於範圍的for循環遍歷向量。這將確保您不會訪問出界。