当前位置:  开发笔记 > 编程语言 > 正文

C++从vector <algorithm>和<functional>中删除字符串

如何解决《C++从vector<algorithm>和<functional>中删除字符串》经验,为你挑选了1个好方法。

对于学校作业,我需要通过使用来删除矢量中的紫色,这就是我想出的:

bool IsEqual(string s, string s2)
{
    if (s == s2)
    {
        return true;
    }
}

int main() {
    vector coulours2 = { "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错误.我该如何正确使用它?



1> templatetype..:

对于初学者,不推荐使用std::bind1ststd::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());

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有