簡體   English   中英

在運行時C ++中將元素插入向量。拋出運行時錯誤

[英]Insert an element to a vector at run time C++.Throwing Runtime Error

我想在運行時將一些元素插入向量中。 我來啦。

目的是打印"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;
}
}

但是它拋出運行時錯誤。

vect.insert(vect.begin()+2, "I am");
 }
cout << *it;

更改擁有的容器后,迭代器將失效-即itinsertpush_back后不能使用it

添加元素后,可能需要自動調整向量的大小並重新分配,如果發生這種情況,則迭代器將不再有效。

盡管我真的不知道為什么需要這樣做,但是有一個安全的解決方法。 您可以存儲迭代器的當前索引,將新元素插入向量中,然后重新分配迭代器以引用潛在的新內存地址。 我已經在此處包含執行此操作的代碼。

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;

一旦std :: vector :: insert()的重載之一具有簽名的迭代器插入(迭代器位置,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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM