Я использую Code :: Blocks, и вот мой код ниже в c++.
void removeEvenLength(vector<string> &vec)
{
for (vector<string>::reverse_iterator i = vec.rbegin(); i != vec.rend(); ++i)
{
string word = *i;
if (word.length() % 2 == 0)
vec.erase(i);
}
}
Эта функция принимает вектор строк и удаляет слово, которое равно длине букв. Я получаю сообщение об ошибке, в котором говорится, что для удаления требуется 2 аргумента, но согласно документации c++, все должно быть в порядке. Вы знаете, что не так?
Если вы абсолютно должны использовать erase()
с обратным итератором, вот как это сделать:
void removeEvenLength(vector<string> &vec)
{
for (vector<string>::reverse_iterator i = vec.rbegin(); i != vec.rend();)
{
string word = *i;
if (word.length() % 2 == 0) {
vector<string>::iterator newi = vec.erase(i.base() - 1);
i = vector<string>::reverse_iterator(newi);
} else {
++i;
}
}
}
Но это не лучший способ удалить все строки четной длины в векторе по ряду причин. Способ сделать это следующим образом (он называется "стирать-удалить" идиому):
struct IsEven {
bool operator()(const string &s) const {
return (s.size() % 2) == 0;
}
};
vec.erase(
std::remove_if(vec.begin(), vec.end(), IsEven()),
vec.end()
);
Или в С++ 11 вы можете использовать лямбда вместо отдельного функтора:
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
[](const string &s) { return (s.size() % 2) == 0; }
),
vec.end()
);
remove_if
должна принимать функцию, то это неверно. Это займет все, что можно назвать. В этом случае экземпляр IsEven
может быть вызван, потому что он перегружен operator()
. В C ++ это называется функтором. (3). Да, remove_if
возвращает конец диапазона, которые являются ложными, что, следовательно, также является началом диапазона, которые являются истинными. Призыв стереть удаляет истинные.
Если вы видите, например, эту ссылку, вы увидите, что erase
принимает iterator
или const_iterator
, а не reverse_iterator
. Поэтому вы не можете использовать его при повторном обратном направлении.
Кроме того, как было предложено Chris в комментарии, вы можете использовать std::remove_if
. Связанная ссылка содержит пример того, как ее использовать.
erase
(см., Например, эту ссылку ).std::remove_if
.