我正在使用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 ++文档,一个应该没问题。你知道出了什么问题吗?
答案 0 :(得分:1)
如果绝对必须将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()
);
或者在C ++ 11中,您可以使用lambda而不是单独的仿函数:
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
[](const string &s) { return (s.size() % 2) == 0; }
),
vec.end()
);
答案 1 :(得分:0)
如果您看到例如this reference您会看到erase
需要iterator
或const_iterator
,而不是reverse_iterator
。因此,在向后迭代时不能使用它。
另外,正如Chris在评论中所建议的那样,您可能希望使用std::remove_if
代替。链接引用包含一个如何使用它的示例。