对于学校作业,我需要通过使用来删除矢量中的紫色,这就是我想出的:
bool IsEqual(string s, string s2) { if (s == s2) { return true; } } int main() { vectorcoulours2 = { "red", "green", "blue", "orange", "purple", "orange", "black", "green" }; vector ::iterator newEnd; newEnd = remove_if(coulours2.begin(), coulours2.end(), bind2nd(IsEqual, "purple")); colours2.erase(newEnd); cin.get(); return 0; }
但是我遇到了很多错误,我认为我使用的是bind2nd错误.我该如何正确使用它?
对于初学者,不推荐使用std::bind1st
和std::bind2nd
功能.你应该考虑使用std::bind
,这更通用,更容易使用.
如果你不希望使用bind2nd
,那么你传递的功能必须是适应功能,即出口一些额外的类型信息的函数对象类型.要将原始函数指针转换为自适应函数,请使用有趣的命名ptr_fun
函数:
remove_if(coulours2.begin(), coulours2.end(), bind2nd(ptr_fun(IsEqual), "purple"));
但是,根本不需要在这里定义自己的功能.只需使用std::equal_to
:
remove_if(coulours2.begin(), coulours2.end(), bind2nd(equal_to(), "purple"));
正如评论中提到的,您也使用了erase/remove_if
不正确的模式.试试这个:
coulours2.erase(remove_if(coulours2.begin(), coulours2.end(), bind2nd(equal_to(), "purple")), coulours2.end());
使用"更好"的方法std::bind
看起来像这样:
using namespace std::placeholders; coulours2.erase(remove_if(coulours2.begin(), coulours2.end(), bind(equal_to(), _1, "purple")), coulours2.end());
或者只使用lambda:
coulours2.erase(remove_if(colours2.being(), colours2.end(), [](const string& elem) { return elem == "purple"; }, coulours2.end());