我最近遇到了一个问题,我认为boost :: lambda或boost :: phoenix可以帮助解决,但我无法正确理解语法,所以我采用了另一种方式。我想要做的是删除“字符串”中小于一定长度但不在另一个容器中的所有元素。
这是我的第一次尝试:
std::vector<std::string> strings = getstrings();
std::set<std::string> others = getothers();
strings.erase(std::remove_if(strings.begin(), strings.end(), (_1.length() < 24 && others.find(_1) == others.end())), strings.end());
我最终如何做到这一点:
struct Discard
{
bool operator()(std::set<std::string> &cont, const std::string &s)
{
return cont.find(s) == cont.end() && s.length() < 24;
}
};
lines.erase(std::remove_if( lines.begin(), lines.end(), boost::bind<bool>(Discard(), old_samples, _1)), lines.end());
答案 0 :(得分:3)
你需要boost :: labmda :: bind到lambda-ify函数调用,例如长度&lt; 24部分成为:
bind(&string::length, _1) < 24
修改
请参阅“Head Geek”的帖子,了解为什么set :: find很棘手。他得到它来解决正确的set :: find重载(所以我复制了那部分),但他错过了一个必要的boost :: ref() - 这就是为什么与end()的比较总是失败(容器被复制)
int main()
{
vector<string> strings = getstrings();
set<string> others = getothers();
set<string>::const_iterator (set<string>::*findFn)(const std::string&) const = &set<string>::find;
strings.erase(
remove_if(strings.begin(), strings.end(),
bind(&string::length, _1) < 24 &&
bind(findFn, boost::ref(others), _1) == others.end()
), strings.end());
copy(strings.begin(), strings.end(), ostream_iterator<string>(cout, ", "));
return 0;
}
答案 1 :(得分:2)
除了bind
调用(Adam Mitz在该部分上是正确的)之外,主要问题是std::set<std::string>::find
是一个重载函数,所以你不能直接在{bind
中指定它。 1}}打电话。您需要告诉编译器使用哪个 find
,如下所示:
using namespace boost::lambda;
typedef std::vector<std::string> T1;
typedef std::set<std::string> T2;
T1 strings = getstrings();
T2 others = getothers();
T2::const_iterator (T2::*findFn)(const std::string&) const=&T2::find;
T2::const_iterator othersEnd=others.end();
strings.erase(std::remove_if(strings.begin(), strings.end(),
(bind(&std::string::length, _1) < 24
&& bind(findFn, boost::ref(others), _1) == othersEnd)),
strings.end());
这个编译,但它无法正常工作,原因我还没想到...... find
函数永远不会返回others.end()
,所以它永远不会删除任何东西。仍然在努力。
编辑:更正,find
函数 返回others.end()
,但比较无法识别。我不知道为什么。
后期编辑:感谢Adam的评论,我看到出了什么问题,并纠正了问题。它现在按预期工作。
(如果您想查看我的完整测试程序,请查看编辑历史记录。)