2011-10-01 39 views
2

嗨,大家好我會顯示三個代碼1和2做同樣的工作,但第三個不工作。我想了解爲什麼不工作或爲什麼另外兩個工作? (strrand函數產生的隨機串)爲什麼我應該在函數generate_n中使用back_inserter?

1.

int main(){ 
    vector<string> svec(50); 
    randomize(); 

    generate_n(svec.begin(), 20, strrand); 
    display(svec.begin(), svec.end()); 

    return 0; 
} 

2.

int main() { 
    vector<string> svec; 
    randomize(); 

    generate_n(back_inserter(svec), 20, strrand); 
    display(svec.begin(), svec.end()); 

    return 0; 
} 

3.

int main(){ 
    vector<string> svec; 
    randomize(); 

    generate_n(svec.begin(), 20, strrand); 
    display(svec.begin(), svec.end()); 

    return 0; 
} 

回答

4

第三有未定義的行爲。在第一個中,您指定了定義矢量的矢量大小。這意味着它從50個默認初始化(空)字符串的矢量開始。然後用隨機字符串覆蓋這些字符串。

在第二個中,您使用back_insert_iterator將字符串單獨添加到矢量。

第三,你從一個空向量開始,並且嘗試使用(無效的)迭代器到它的(不存在的)開始。然後你寫20個字符串,從內存中任意一個點開始,它的(隨機)初始值恰好指向。然而,你並沒有在任何時候實際插入一個字符串到矢量中。矢量通常保持當前包含的項目數量;在第三種情況下,這將從0開始,並始終保持爲0。當你試圖顯示「內容」時,你應該什麼都不會(因爲你在那時已經有了未定義的行爲,任何事情都是可能的 - 特別是如果你寫的一些數據碰巧覆蓋了向量內部的一部分。數據

你有什麼是衆所周知的初學者失誤稍多一些微妙的(但同樣有問題的)版本,例如:

char *s; 

strcpy(s, "This will give UB"); 
+0

在第二,而我使用的是back_insert_iterator,做back_insert_iterator初始化向量類 – iyasar

+0

現在我明白了..!謝謝..!back_insert_iterator在其中使用push_back。 – iyasar

相關問題