2012-09-13 24 views
0

我想在運行時將一些元素插入向量中。 我在這裏。在運行時C++將一個元素插入到一個向量中。拋出運行時錯誤

的目的是打印"Hello Hi I am Rasmi"

int main() 
{ 
vector<string>vect; 
vect.push_back("Hello"); 
vect.push_back("Hi"); 
vect.push_back("Rasmi"); 
for(vect<string>::iterator it = vect.begin(); it != vect.end(); ++it) 
{ 
if(*it == "Rasmi") // If it encounters "Rasmi" 
    { it--; 
     vect.insert(vect.begin()+2, "I am"); 
    } 
    cout << *it; 
} 
} 

但它拋出運行時錯誤,

+1

如果你只是在尋找字符串的一個實例在數組中,那麼使用'it = std :: find(vect.begin(),vect.end(),「Rasmi」)' –

回答

2

雖然我真的不知道爲什麼你需要做這樣的事情,但有一個安全的解決方法。您可以存儲迭代器的當前索引,將新元素插入向量中,然後重新分配迭代器以引用潛在的新內存地址。我在這裏包含了代碼。

if(*it == "Rasmi") // If it encounters "Rasmi" 
{ 
    it--; 
    int index = it - vect.begin(); // store index of where we are 
    vect.insert(vect.begin()+2, "I am"); 
    it = vect.begin() + index; // vect.begin() now refers to "new" begin 
    // we set it to be equal to where we would want it to be 
} 
cout << *it; 
2
vect.insert(vect.begin()+2, "I am"); 
} 
cout << *it; 

迭代器失效,你的變異擁有容器之後 - 即你不能使用it後您insertpush_back ...

在添加元素,向量可能需要調整和重新分配自動,如果發生這種情況,迭代器不再有效。

+1

我更喜歡你的答案,但最後一句話聽起來像是責任的開發人員正確調整矢量大小。 –

+0

位於插入點之前的迭代器只有在矢量被調整大小或分配的情況下才會失效。也許這就是你的意思,但這聽起來像是你說每次調用'insert'或'push_back'都會使每個迭代器失效。 –

+0

@ZdeslavVojkovic這是真的,我的部分措辭不佳。 –

-1

只要標準::矢量::插入()的重載之一,具有簽名 iterator insert (iterator position, const T& x)你可以重寫你的代碼如下

for(vect<string>::iterator it = vect.begin(); it != vect.end();) 
{ 

    if(*it == "Rasmi") // If it encounters "Rasmi" 
    { 
     it = vect.insert(it, "I am");   
     cout << *it; 
     ++it; 
    } 
    cout << *it; 

    ++it; 
} 
相關問題