4

我最近遇到了一个问题,我认为 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());
4

2 回答 2

3

您需要 boost::labmda::bind 来进行 lambda-ify 函数调用,例如 length < 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;
}
于 2008-10-17T23:57:49.280 回答
2

主要问题,除了bind调用(亚当米茨在那部分是正确的),std::set<std::string>::find是一个重载的函数,所以你不能直接在bind调用中指定它。您需要告诉编译器使用哪个 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(),但比较无法识别它。我不知道为什么。

后期编辑:感谢亚当的评论,我知道出了什么问题,并纠正了问题。它现在按预期工作。

(如果您想查看我的完整测试程序,请查看编辑历史记录。)

于 2008-10-18T00:37:14.737 回答