Значение набора C ++ внезапно изменилось после стирания? - PullRequest
0 голосов
/ 06 августа 2020

Я не мог понять, почему внезапно изменилось целое число. Если это из-за стирания, разве это не должно происходить сразу после того, как я его стираю? Тогда это будет вызвано манипулированием массивом домов houses[a[*j].household_id].agent_id.insert(i);? Но это не изменило *j или family_set[2]. Я запуталась ....

class env
{
   set<int> agent_id;
}
class agent
{
   int household_id;
}

unordered_set<int> *family_set=new unordered_set<int>[4];
....
family_set[2].insert(12472);
....
env **houses=new env*[no_area];
agent **agents=new agent*[no_area];
for(int j=0;j<no_area;j++)
{
   houses[i]=new env[j];
   agents[j]=new agent[population[j]];
}

auto j=family_set[2].begin();
cout<<*j<<endl;
family_set[2].erase(*j);
cout<<*j<<endl;
houses[a[*j].household_id].agent_id.insert(i);
cout<<*j<<endl;

Вывод:

12472
12472
6505440

Я пытался стереть * j в самом конце, этого не происходит ....

    auto j=family_set[2].begin();
    cout<<*j<<endl;
    houses[a[*j].household_id].agent_id.insert(i);
    cout<<*j<<endl;
    family_set[2].erase(*j);
    cout<<*j<<endl;

Вывод:

12472
12472
12472

Означает ли это, что *j стирается не мгновенно, а через некоторое время становится случайным числом?

1 Ответ

1 голос
/ 06 августа 2020

Из документации для std::set::erase():

Ссылки и итераторы на удаленные элементы недействительны. Другие ссылки и итераторы не затронуты.

...