我想在运行时将一些元素插入到矢量中。 我走了。
目的是打印"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;
}
}
但它会导致运行时错误。
答案 0 :(得分:2)
vect.insert(vect.begin()+2, "I am");
}
cout << *it;
变异拥有容器后,迭代器失效 - 即在it
或insert
之后无法使用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;
}