在运行时C ++将元素插入向量。抛出运行时错误

时间:2012-09-13 07:41:15

标签: c++ string vector iterator

我想在运行时将一些元素插入到矢量中。 我走了。

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

但它会导致运行时错误。

3 个答案:

答案 0 :(得分:2)

vect.insert(vect.begin()+2, "I am");
 }
cout << *it;
变异拥有容器后,

迭代器失效 - 即在itinsert之后无法使用push_back ...

添加元素后,可能需要调整矢量大小并自动重新分配,如果发生这种情况,迭代器将不再有效。

答案 1 :(得分: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 :(得分:-1)

只要std :: vector :: insert()的重载之一具有签名 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;
}