Вектор набора C ++ дает ошибку сегментации после выполнения push_back - PullRequest
3 голосов
/ 23 марта 2012

Я создал вектор наборов в моей программе, и мне нужно пройти через каждый из наборов. Если в наборе найден определенный элемент, мне нужно добавить новый набор в вектор. Однако это дает мне ошибку сегментации, как только счетчик моего массива достигает элементов, которые я вставил позже (в цикле). В следующем коде включение 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).

Спасибо, что прочитали мой пост.

1 Ответ

4 голосов
/ 23 марта 2012

Когда вы вводите 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());
...