我想一些元素(一个或多个)插入到在运行时的向量。 我来啦。
其目的是要打印"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;
}
}
但它抛出运行时错误。
虽然我真的不知道为什么你需要做这样的事情,有一个安全的解决方法。 您可以存储迭代器的当前索引,将新元素到载体中,然后重新分配迭代器引用潜在的新的内存地址。 我已经包含的代码所以在这里做。
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;
vect.insert(vect.begin()+2, "I am");
}
cout << *it;
迭代器失效,你的变异拥有容器之后-即你不能使用it
之后你insert
或push_back
...
在添加元素,向量可能需要自动调整和重新分配,如果出现这种情况,迭代器不再有效。
只要标准::矢量::插入()的重载之一,有签名的迭代器插入(迭代器位置,常量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;
}