Ну о том и вопрос, что когда он создаётся заново внутри метода erase то учитывается ли что при перестроении ранее не итерированное могло улететь "слева" от нового итератора
Тем более по словарю, он не во всех языках упорядоченный.
Вы создали итератор, дошли до куда-то, что-то удалили, создали новый итератор. Откуда новый итератор знает, что вы делали до этого со старым и с вашей коллекцией?
Кстати я в onlinegdb проверил, erase никак не на начало возвращает итератор:
#include <iostream>
#include <map>
int main()
{
std::map<int, char> MyMap = {
{1, 'a'},
{4, 'n'},
{7, 't'},
{2, 'b'}
};
auto iter = MyMap.begin();
for(auto i = iter; i != MyMap.end(); i++)
std::cout<<(*i).first<<" "<<(*i).second<<"\r\n";
std::cout<<"\r\n";
++iter;
auto iter_new = MyMap.erase(iter);
for(auto i = iter_new; i != MyMap.end(); ++i)
std::cout<<(*i).first<<" "<<(*i).second<<"\r\n";
return 0;
}
выдаёт:
1 a
2 b
4 n
7 t
4 n
7 t
Надо сначала делать remove потом erase. https://en.wikipedia.org/wiki/Erase-remove_idiom
Или std::erase_if из нового стандарта.
Надо сначала делать remove потом erase. https://en.wikipedia.org/wiki/Erase-remove_idiom
так это с векторами, а у меня мапа, выше писал
Или std::erase_if из нового стандарта.
хорошая штука, посмотрю, спасибо
Тем более по словарю, он не во всех языках упорядоченный.
Вы создали итератор, дошли до куда-то, что-то удалили, создали новый итератор. Откуда новый итератор знает, что вы делали до этого со старым и с вашей коллекцией?
Знает по идее функция erase которая и возвращает новый итератор, ну по крайней мере хочется надеяться что она при удалении элемента если перестраивает дерево то и новый итератор возвращает такой чтобы уже пройденные по старому итератору элементы не проходить заново
новый итератор? С чего бы ему показывать куда-то в середину коллекции (для простоты я сейчас про обычный список говорю, не про какое-нибудь неупорядоченное множество).
странный какой-то вопрос. Разумеется, новый итератор будет показывать на начало коллекции и все встреченные ранее элементы снова встретятся.

