Стандарт не совсем разъясняет это, но v.erase(q)
определено, "Стирает элемент, на который указывает q
" в [sequence.reqmts]
. Это означает, что q
должен фактически указывать на элемент, а конечный итератор - нет. Передача в конце итератора - неопределенное поведение.
К сожалению, вам нужно написать:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
Конечно, вы можете определить:
template typename<Sequence, Iterator>
Iterator my_erase(Sequence &s, Iterator it) {
if (it == s.end()) return it;
return s.erase(it);
}
my_erase(v, std::find(v.begin(), v.end(), whatever));
c.erase()
в ассоциативном контейнере возвращает void
, поэтому, чтобы обобщить этот шаблон для всех контейнеров, вам понадобится какое-то действие -> decltype
.