我正在考虑在下面的伪代码中对字符串向量使用remove_if
,如下所示:
for(some strings in a given set) {
remove_if(myvec.begin(), myvec.end(), string_matches_current_string);
}
现在,我知道我可以定义谓词并轻松完成这项工作。但我想知道是否有一个标准模板函数可以代替上面的谓词来使用它。我环顾四周,找不到一个。通过示例欣赏任何想法。谢谢!
答案 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 ¤t_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,你应该使用常规循环。