首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::remove vs std::remove_if

std::remove vs std::remove_if
EN

Stack Overflow用户
提问于 2016-12-17 03:36:08
回答 1查看 292关注 0票数 1

我有一个如下的类:

代码语言:javascript
复制
class Foo
{
public:
    void Fill();
private:
    std::vector<std::wstring> vec;
};

然后实现是:

代码语言:javascript
复制
void Foo::Fill()
{
    vec.push_back( L"abc aaa" );
    vec.push_back( L"def aaa" );
    vec.push_back( L"fed bbb" );
    vec.push_back( L"cba bbb" );
}

我想要做的是从这个向量中删除一个元素,假设有一个包含"def“的元素。最简单的方法是什么?

我在考虑使用remove_if,但比较器只接受1个参数容器元素。

有一个优雅的解决方案吗?我会使用循环作为最后的手段。

EN

回答 1

Stack Overflow用户

发布于 2016-12-17 03:39:32

如果它是一个类而不是一个函数,则谓词有一个构造函数,并且构造函数可以接受参数。

您可以将搜索字符串传递给此构造函数,将其存储为成员,然后在函数调用运算符中使用它:

代码语言:javascript
复制
struct Pred
{
    Pred(std::wstring str) : str(std::move(str)) {}
    bool operator()(const std::wstring& el) const
    {
       return el.find(str) != el.npos;
    }
private:
    const std::wstring str;
};

std::remove_if(std::begin(vec), std::end(vec), Pred("def"));

// N.B. `el.find` is probably wrong. Whatever.

这样做的一个“捷径”是对谓词使用lambda,然后搜索字符串的传递将通过lambda捕获为您完成,或者通过您直接在此处输入的事实来完成:

代码语言:javascript
复制
std::remove_if(
   std::begin(vec), std::end(vec),
   [](const auto& el) { return el.find("def") != el.npos; }
);

// N.B. `el.find` is probably still wrong. Whatever.

如果谓词是一个函数,并且您希望它调用一个二进制比较器,那么您可以通过修改std::bind来获得相同的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41191340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档