set的C ++向量在执行push_back后给出分段错误

Ara*_*ani 3 c++ stl vector segmentation-fault push-back

我已经在程序中创建了一个集合向量,我需要遍历每个集合。如果在集合中找到特定元素,则需要向向量添加一个新集合。但是,一旦我的数组的计数器到达后来插入的元素(在循环内),这就会给我带来分段错误。在以下代码中,打开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;
}
Run Code Online (Sandbox Code Playgroud)

如果有人能解释为什么会给出错误(以gcc为单位),我将不胜感激。

感谢您浏览我的帖子。

And*_*nck 5

当您push_back进入向量时,如果向量需要分配更多的内存,则会使对其中所有元素的引用无效。在您的情况下,迭代器itr在之后无效push_back。一种解决方案是将这些集合添加到单独的列表(向量)中,然后在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());
Run Code Online (Sandbox Code Playgroud)