Проще всего это понять, если разделить утверждения:
auto iter(remove_if(myVector.begin(), myVector.end(), StringLengthTest));
myVector.erase(iter);
Эти 2 строки делают то же, что и ваша строка. И теперь должно быть ясно, что такое «ошибка». remove_if, работает первым Он перебирает весь вектор и перемещает все «выбранные» записи «в конец» (лучше сказать: он перемещает невыбранные записи вперед). После запуска он возвращает итератор в «последнюю» позицию оставшихся записей, что-то вроде:
это
тест
вектор
test <- указывает итератор здесь <br>
вектор
Затем вы запускаете стирание с помощью одного итератора. Это означает, что вы удаляете единственный элемент, на который указывает указатель - поэтому вы удаляете элемент «test». - То, что осталось, это то, что ты видишь.
Чтобы исправить это, просто удалите вектор, возвращаемый remove_if в конец ().:
myVector.erase(remove_if(myVector.begin(), myVector.end(), StringLengthTest), myVector.end()); //erase anything in vector with length <= 3