2012-03-23 6 views
3

私のプログラムでセットのベクトルを作成しましたが、それぞれのセットを通過する必要があります。セットに特定の要素がある場合は、新しいセットをベクターに追加する必要があります。しかし、これは私の配列のカウンタが後で(ループ内で)挿入した要素に到達するとすぐに私にセグメンテーションフォールトを与えます。次のコードでは、list.push_back(cS)をオンにするとセグメント化エラーが発生します。セットのC++ベクタがpush_backを実行した後にセグメンテーションフォールトを返します

int main(void) { 
set<int> cS; 
vector<set<int> > list; 

cS.insert(1); 
list.push_back(cS); 

cS.insert(2); 
list.push_back(cS); 

for (int ctr = 0; ctr < list.size(); ctr++) 
{ 
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++) 
    { 
     if (*itr == 1 || *itr == 2) 
     { 
      cS.clear(); 
      cS.insert(3); 
      //list.push_back(cS); 
     } 
    } 
} 

for (int ctr = 0; ctr < list.size(); ctr++) 
{ 
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++) 
    { 
     cout << *itr << endl; 
    } 
} 

return 0; 
} 

なぜこのエラー(gcc)が発生するのか説明できる人に感謝します。

私の投稿をありがとうございました。

+0

ではなく、ベクトル? –

+0

習慣から外れていると思います。私が知る限り、ベクトルの場合、イテレータまたはインデックスを使用することは同等です。 – Arani

答えて

4

push_backをベクターに追加すると、ベクターがより多くのメモリーを割り当てる必要がある場合、その中のエレメントへのすべての参照が無効になります。あなたの場合、イテレータitrpush_backの後に無効になります。一つの解決策は、別のリスト(ベクトル)にセットを追加することで、その後、ループの後に一度にすべてを追加します:あなたがセットのためのイテレータを使用しない理由だけで好奇心のうち

vector<set<int> > add; 
for (int ctr = 0; ctr < list.size(); ctr++) 
{ 
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++) 
    { 
     if (*itr == 1 || *itr == 2) 
     { 
      cS.clear(); 
      cS.insert(3); 
      add.push_back(cS); 
     } 
    } 
} 
list.insert(list.end(), add.begin(), add.end()); 
+0

その場合、ベクトルの各要素を反復処理する方法はありませんが、特別な場合には要素をいくつか挿入する方法はありますか? – Arani

+0

'push_back'は必ずしもイテレータを無効にするわけではありませんが、' push_back'の呼び出しによって無効になることがあります。 – Nawaz

+0

@ user571376:インデックスベースの反復を使用します。 – Nawaz