向量擦除期望2个参数错误

时间:2013-12-22 23:09:45

标签: c++

我正在使用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 ++文档,一个应该没问题。你知道出了什么问题吗?

2 个答案:

答案 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需要iteratorconst_iterator,而不是reverse_iterator。因此,在向后迭代时不能使用它。

另外,正如Chris在评论中所建议的那样,您可能希望使用std::remove_if代替。链接引用包含一个如何使用它的示例。