Исправлено неверное итератор - PullRequest
0 голосов
/ 13 марта 2020

Итак, в поисках совета о том, как исправить ситуацию или, возможно, лучший способ ее запрограммировать.

Я использую итерацию для построения сложной строки из пар ключ: значение в unordered_map. Чтобы сделать это, я перебираю карту, чтобы найти определенные c элементы, а затем отправляю поисковый термин внешней функции для создания строки. Внешняя функция использует свой собственный итератор для поиска того же unordered_map для переданного поискового термина, затем создает строку и затем удаляет записи, на которые она ссылалась. Проблема, я полагаю, заключается в том, что хотя итератор внешней функции все еще действителен, потому что он вызвал функцию стирания, итераторы в основной функции теперь становятся недействительными и выдают ошибку вне диапазона. Есть ли способ сбросить итераторы или отправить их в следующую действительную пару ключ: значение, когда они становятся недействительными, чтобы избежать ошибки?

Код - беспорядок (в основном потому, что я все еще открываю C ++ ) и может быть возможно использовать рекурсию для выполнения sh этого, но я не смог заставить рекурсию работать правильно.

Я могу опубликовать код, но без понимания входных данных и требуемых выходных данных, это, вероятно, не поможет объяснить что-либо, так что пока я просто оставлю вопрос как есть: есть ли способ «повторной проверки» недействительных итераторов?

1 Ответ

0 голосов
/ 14 марта 2020

Мне удалось решить проблему, переопределив каждый из итераторов, как только область контроля вернулась к ним. Для последнего итератора (во внешней функции), который удалил отдельные пары ключ: значение из unordered_map, я использовал:

if (it != map.end()) it = map.erase(it);

Это вынуждает итератор перейти к следующей действительной паре ключ: значение после стирания .

Это сработало для конца строки, но не сработало, когда управление было возвращено каждому из предыдущих итераторов. В этих случаях итераторы были аннулированы, когда внешняя функция стерла пару ключ: значение. Так как управление вернулось к итератору, я включил следующую строку, прежде чем он возвращался для приращения:

if (it != map.end()) it = map.begin();

Кажется, это решило все проблемы, хотя я уверен, что есть лучший способ справиться это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...