C++11 标准::删除vs标准::删除

C++11 标准::删除vs标准::删除,c++11,vector,stl,C++11,Vector,Stl,我有以下课程: class Foo { public: void Fill(); private: std::vector<std::wstring> vec; }; 我想从这个向量中删除一个元素,比如说一个包含“def”的元素。最简单的方法是什么 我想使用remove_if,但是比较器只接受1个参数-container元素 有优雅的解决方案吗?我将使用循环作为最后手段。如果它是一个类而不是一个函数,谓词有一个构造函数,构造函数可以接受参数 您可以将搜索字符串传递到

我有以下课程:

class Foo
{
public:
    void Fill();
private:
    std::vector<std::wstring> vec;
};
我想从这个向量中删除一个元素,比如说一个包含“def”的元素。最简单的方法是什么

我想使用remove_if,但是比较器只接受1个参数-container元素


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

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

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

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捕获为您完成搜索字符串的传递,或者通过您在此处直接键入它,然后:

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
来获得相同的结果。

您在说什么比较器?
remove\u If
需要一元谓词。您可以传递一个lambda,该lambda根据您的搜索返回true或false。为什么谓词需要多个参数(我想这就是您所说的comparator)?@MikeMB,很抱歉术语混淆了。我希望发送元素和字符串来比较元素。类似于:bool pred(std::wstring elem,std::wstring element_to_remove)@伊戈尔:没问题。我相信LRiO已经回答了您满意的问题?我遇到了一个编译器错误:“参数不能具有包含“auto”的类型”。将“auto”更改为“std::wstring”后,所有内容都可以正常编译和运行。顺便说一句,e1.find()是一个正确的函数。@Igor:您使用的是一个来自黑暗时代的编译器,显然:)是的,在C++14之前,您需要指定类型。不是真的。我有MSVC2010,这对于我的目的来说已经足够了(C++11)@Igor:C++11的一个非常有限的子集…;-]@伊尔贾恩,到目前为止,我的目标已经足够了…;-)
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.