0

我想在运行时将一些元素插入到向量中。我来啦。

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

但它抛出运行时错误。

4

3 回答 3

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

在您改变拥有的容器后,迭代器将失效 - 即您不能it在您之后使用insertpush_back......

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

于 2012-09-13T07:42:34.547 回答
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;
于 2012-09-13T07:48:49.803 回答
-1

只要 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;
}
于 2012-09-13T08:56:24.830 回答