2014-04-16 64 views
-2

一部分的程序我用爲字符串值追加到一個向量所需的工作。我伸手分割故障時附加的字符串值,如下所示:追加到與的push_back一個矢量,而不是[]

for(int i = 0; i < testvec.size(); i++) { 
    testvec[i] = oldvec[i]; 
} 

但我的程序編譯此代碼正確執行:

for(int i = 0; i < testvec.size(); i++) { 
    testvec.push_back(i); 
} 

這是它的精神,我們在做什麼是更新矢量

+1

第二個循環或者不執行任何操作(如果'testvec.size()== 0')或者直到程序最終耗盡內存(否則)不會終止。只要'oldvec.size()> = testvec.size()',第一個循環就可以(但實際上並沒有追加任何東西),否則就會出現未定義的行爲。無論如何,我不清楚哪一段代碼應該實現。 –

+0

要在另一個向量的末尾附加一個向量的內容,請寫'testvec.insert(testvec.end(),oldvec.begin(),oldvec.end());'。沒有必要的循環。 –

+0

問題是什麼? – juanchopanza

回答

0

operator[]索引到已經存在空間在vector。說你的載體構建默認:

std::vector<std::string> v; 

然後做v[i]任何i是不確定的行爲,因爲沒有保證任何空間尚未分配給存儲值。這實際上相當於:

std::string *storage; 
storage[i] = "..."; 

您的代碼看起來還是不正確的:我猜它實際上是這樣的:

for(int i = 0; i < oldvec.size(); i++) { 
    testvec.push_back(oldvec[i]); 
} 

這是繞了很長的路:構建具有矢量包含在另一個向量的元素,最簡單的方法是:

std::vector<std::string> testvec(oldvec.begin(), oldvec.end()); 
+0

我實際上編輯了我的帖子,我想你的回答是針對編輯前的問題。我的代碼實際上是用push_back編譯的,而不是運算符[]。 – Suede

+0

'std :: vector testvec(oldvec);'更簡單。 – Jarod42

0

push_back()是追加項目載體的正確方法。它將根據需要重新分配底層內存塊以適應新項目。 operator[]然而,不長的矢量,因此,如果向量以前用resize()或用push_back()將調整它只能插入新項目。如果您嘗試在不這樣做的情況下使用operator[],則會導致未定義的行爲。