Я пытаюсь перебирать вектор и удалить отдельные элементы из Это. Я работаю в конце вектора вниз, чтобы я не испортил итератор, поскольку элементы удалены,
В дополнение к передаче по ссылке вместо значения, вместо того, чтобы писать циклы и беспокоиться о недействительными итераторами, научиться использовать алгоритмы, а точнее, идиому erase/remove_if
для контейнеров, таких как вектор. Очень просто даже для хороших программистов на C++ сделать ошибку, поэтому алгоритмы должны использоваться.
Вот пример использования идиомы (erase/remove_if).
#include <algorithm>
//...
bool IsGreater(int val) { return val > 6; }
//...
test.erase(std::remove_if(test.begin(), test.end(), IsGreater), test.end());
Remove_if принимает элементы, которые удовлетворяют условию и перемещают их до конца вектора. Возвращаемое значение remove_if() - это итератор, который указывает на начало перемещенных элементов. Затем erase() берет элементы и удаляет их из вектора.
Преимущество в том, что это так, много, но один из них заключается в том, что вам больше не нужно беспокоиться о «запутывании итераторов». Это очень сложно испортить - один способ испортить - либо вы предоставляете неправильные типы итераторов (тогда вы получите синтаксическую ошибку), либо ваша функция сравнения не работает (легко фиксируется). Но во время выполнения вряд ли удастся использовать недействительные итераторы.
Другим преимуществом является то, что любой хороший программист на C++ может сразу понять, что делает erase/remove_if(). Если я смотрю на ваш код, и вы никогда не говорили нам, что он сделал, я бы
1) должен прочитать его несколько раз, чтобы получить то, что происходит и
2) должен запустить его под отладчиком посмотрите, делает ли он то, что я думаю, и делаю это правильно.
С помощью алгоритмов я точно знаю, что делает код, а что еще более важно, код работает без необходимости запускать его под отладчиком.
Обратите внимание, что в примере, который я предоставил, используется простая функция IsGreater().Другие способы записи тестовой функции - использовать std :: greater <> (вместе с std :: bind1st), используя объект функции, используя лямбду и т. Д. Но я предоставил, вероятно, самый простой способ изначально понять, что такое происходит.
Какая ошибка? – ChronoTrigger
опубликуйте сообщение об ошибке и укажите строку кода с ошибкой. – atoMerz
Так много чего не так ... Для одного, 'int &' не является [итератором] (http://en.cppreference.com/w/cpp/concept/Iterator) (это то, что 'erase()' принимает как аргумент)! – jrok