3

プログラムでセットのベクトルを作成しました。各セットを処理する必要があります。セット内に特定の要素が見つかった場合は、ベクターに新しいセットを追加する必要があります。ただし、これにより、後で (ループ内で) 挿入した要素に配列のカウンターが到達するとすぐに、セグメンテーション違反が発生します。次のコードでは、list.push_back(cS) をオンにすると、セグメンテーション違反が発生します。

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で)誰かが説明してくれたらありがたいです。

私の投稿をご覧いただきありがとうございます。

4

1 に答える 1

6

ベクターにpush_back入ると、ベクターがより多くのメモリを割り当てる必要がある場合に備えて、ベクター内の要素へのすべての参照を無効にします。あなたの場合、イテレータは。itrの後に無効になりますpush_back。1つの解決策は、セットを別のリスト(ベクトル)に追加し、forループの後に一度にすべて追加することです。

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());
于 2012-03-23T07:39:33.560 に答える