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

なぜそんなことをする必要があるのか​​私にはよくわかりませんが、安全な回避策があります。イテレータの現在のインデックスを保存し、新しい要素をベクトルに挿入してから、イテレータを再割り当てして、潜在的な新しいメモリアドレスを参照することができます。ここにそうするためのコードを含めました。

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 に答える
2
vect.insert(vect.begin()+2, "I am");
 }
cout << *it;

所有しているコンテナーを変更した後、イテレーターは無効になります。つまり、変更it後は使用できません。insertまたはpush_back...

要素を追加した後、ベクターのサイズを変更して自動的に再割り当てする必要がある場合があります。その場合、反復子は無効になります。

于 2012-09-13T07:42:34.547 に答える
-1

std :: vector :: insert()のオーバーロードの1つに署名イテレーター挿入(イテレーター位置、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 に答える