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.