Я обнаружил неожиданный результат, когда мой код вставлял элемент в std :: set во время его итерации.Мне нужно просветление.
Вот код теста:
template<class Ti, class T>
void iteration_insertion(Ti start, Ti end, T& S){
for (auto ite=start;ite!=end;++ite){
auto before=*ite;
if(*ite % 2)
S.insert(*ite*2);
else
S.insert(*ite/2);
if(before!=*ite)
cout<<before<<","<<*ite<<endl;
}
}
void test() {
set<int> S1({4,7,10,13}),S2(S1);
cout<<"ascending\n";
iteration_insertion(S1.begin(),S1.end(),S1);
cout<<"descending\n";
iteration_insertion(S2.rbegin(),S2.rend(),S2);
}
и результат:
ascending
descending
13,26
Как мы видим элемент, на который указывает итераторменяется после вставки, иногда.Но я не могу сказать, когда это произойдет.В тестовом коде это произошло только один раз, за 13 по убыванию.Почему в восходящей итерации такого несоответствия нет?Почему нет несоответствия для 7 в нисходящей итерации?Как предотвратить это?Я в порядке с новой добавленной стоимостью, может быть повторен позже, что ожидается.Я просто не хочу, чтобы итератор изменялся путем вставки.
Тестовый код может быть общей эвристической практикой: из каждого текущего состояния генерируются новые состояния для дальнейшей проверки.