Очень простой вопрос, но я не мог найти ответ. Это сделало бы ужасным смысл для его разрешения, но нужно дважды проверить.Проходит векторный конец() в std :: vector :: erase valid?
std::vector<int> v(10, 0);
v.erase(v.end()); // allowed or not?
Очень простой вопрос, но я не мог найти ответ. Это сделало бы ужасным смысл для его разрешения, но нужно дважды проверить.Проходит векторный конец() в std :: vector :: erase valid?
std::vector<int> v(10, 0);
v.erase(v.end()); // allowed or not?
недопустимое положение или диапазон вызывает неопределенное поведение.
От here
Итератора позы должны быть действительными и разыменовываемыми. Таким образом, итератор end() не может быть использован как значение для pos.
Для одного аргумента перегружать она недействительна передать end()
к std::vector::erase
, потому что единственный аргумент перегрузки сотрет элемент в этой позиции. В позиции end()
нет элемента, так как end()
один за последним элементом.
Однако end()
могут быть переданы перегрузки erase
, которая принимает диапазон итератора:
vec.erase(vec.begin(), vec.end())
Я имел в виду единственный аргумент 'erase' overload. –
Хорошо, что отстой. Спасибо. Интересно, почему они решили пойти так: делает 'v.erase (std :: find (v.begin(), v.end(), item))' invalid. –
@ VioletGiraffe, возможно, вы ищете [erase-remove idiom] (http://en.wikipedia.org/wiki/Erase-remove_idiom)? 'v.erase (std :: remove (v.begin(), v.end(), item), v.end());' – Fiktik
@Fiktik: Хмм, возможно. Но выглядит как избыток для удаления всего одного элемента. –