插入的元件在运行时C ++的载体。投掷运行时错误(Insert an element to a ve

2019-10-30 05:17发布

我想一些元素(一个或多个)插入到在运行时的向量。 我来啦。

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

但它抛出运行时错误。

Answer 1:

虽然我真的不知道为什么你需要做这样的事情,有一个安全的解决方法。 您可以存储迭代器的当前索引,将新元素到载体中,然后重新分配迭代器引用潜在的新的内存地址。 我已经包含的代码所以在这里做。

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;


Answer 2:

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

迭代器失效,你的变异拥有容器之后-即你不能使用it之后你insertpush_back ...

在添加元素,向量可能需要自动调整和重新分配,如果出现这种情况,迭代器不再有效。



Answer 3:

只要标准::矢量::插入()的重载之一,有签名的迭代器插入(迭代器位置,常量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;
}


文章来源: Insert an element to a vector at run time C++.Throwing Runtime Error