2

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

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

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

4

2 回答 2

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 的东西来提供必要的胶水。

于 2012-06-21T01:05:09.530 回答
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,则应该使用常规循环。

于 2012-06-21T01:15:49.237 回答