remove_if string匹配集合中的给定字符串

时间:2012-06-21 00:57:27

标签: c++ string stl remove-if

我正在考虑在下面的伪代码中对字符串向量使用remove_if,如下所示:

for(some strings in a given set) {
  remove_if(myvec.begin(), myvec.end(), string_matches_current_string);
}

现在,我知道我可以定义谓词并轻松完成这项工作。但我想知道是否有一个标准模板函数可以代替上面的谓词来使用它。我环顾四周,找不到一个。通过示例欣赏任何想法。谢谢!

2 个答案:

答案 0 :(得分:3)

我很确定没有标准函数,但您可以使用C ++ 11 lambda轻松编写整个表达式:

std::remove_if(myvec.begin(), myvec.end(),
              [&compare_me](std::string const& cmp) -> bool
              {
                return compare_me == cmp;
              });

compare_me是外循环设置的“当前”字符串。

请记住,remove_if会将迭代器返回到最后一个有效元素之后,因此为了获得正确的myvec,您必须删除remove_if和myvec.end()返回的迭代器之间的元素。

对于非C ++ 11实现,您必须将lambda转换为函数或函子。如果你把它变成一个仿函数,你可以直接传递仿函数,如果把它变成一个函数,你必须使用像boost :: bind这样的东西来提供必要的粘合剂。

答案 1 :(得分:3)

如果您已经知道要删除的值,为什么要使用std::remove_if?使用std::remove删除与指定值匹配的提供范围内的项目:

std::vector<std::string>::iterator new_end = my_vec.end();
for(const auto &current_set_string : some_set)
    new_end = std::remove(myvec.begin(), new_end, current_set_string);
my_vec.erase(new_end, my_vec.end()); // effectively remove them from the vector.

请注意,我使用基于范围的for循环只是为了缩短它,但如果你不能使用C ++ 11,你应该使用常规循环。