Подтвердить что ты не робот

Стирание вектора:: конец от вектора

Правильно ли он работает (ничего не делает), когда я использую

 vector<T> v;
 v.erase(v.end());

Я хочу использовать что-то вроде

 v.erase(std::find(...));

Должен ли я if это v.end() или нет?
Об этом нет на С++. Com и CPPreference

4b9b3361

Ответ 1

Стандарт не совсем прописан, но v.erase(q) определен, "Стирает элемент, на который указывает q" в [sequence.reqmts]. Это означает, что q должен фактически указывать на элемент, который итератор конца не делает. Передача в конце итератора - это поведение undefined.

К сожалению, вам нужно написать:

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.

Ответ 2

Стирание end() (или, если на то пошло, даже глядя на цель end()), это поведение undefined. Поведение undefined допускает любое поведение, включая "просто работу" на вашей платформе. Это не значит, что вы должны это делать; это по-прежнему undefined поведение, и я буду укусить вас наихудшими способами, когда вы меньше всего этого ожидаете.

В зависимости от того, что вы делаете, вы можете рассмотреть set или unordered_set вместо vector здесь.

Ответ 3

Вы пробовали это?

v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());