lambda函数谓词用于find_if,它比较复合类型的map元素

时间:2013-11-22 11:59:47

标签: c++ if-statement find predicate

请参阅以下代码段:

typedef boost::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if
    (
        m.begin(),
        m.end(),
        boost::lambda::bind
            (
                &std::map<int, TUPLE>::value_type::second_type::head,
                boost::lambda::bind
                (
                    &std::map<int, TUPLE>::value_type::second,
                    boost::lambda::_1
                )
            )
        ==
        "someString"
    );

我正在尝试为find_if(使用boost lambda)创建谓词,并将元组的第一个元素与字符串进行比较。但是,有没有办法使这项工作像:

typedef boost::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if
    (
        m.begin(),
        m.end(),
        boost::lambda::bind
            (
                &std::map<int, TUPLE>::value_type::second_type::get<0>,
                boost::lambda::bind
                (
                    &std::map<int, TUPLE>::value_type::second,
                    boost::lambda::_1
                )
            )
        ==
        "someString"
    );

我将second_type :: head更改为second_type :: get&lt; 0&gt;但它没有编译。 我正在尝试创建谓词,将元组的第一个或第二个元素与某个字符串进行比较。

这是我得到的错误之一:

错误29错误C2780:'const boost :: lambda :: lambda_functor&gt;,detail :: bind_tuple_mapper :: type&gt;&gt; boost :: lambda :: bind(const Arg1&amp;)':需要1个参数 - 提供2个

有没有办法专门比较元组的第n个元素? (不只是头部) 我尝试将元组元素表示为struct并且它可以工作但是如果有一种方法可以使用元组,我将不胜感激。

附注:由于编译器版本,我无法使用[](){}表示法。

1 个答案:

答案 0 :(得分:2)

好的我不知道有关提升但是C ++ 11 lambdas会如下:

typedef std::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if(m.begin(), m.end(), [] (const std::pair<int, TUPLE>& v) {
    return v.second.get<1>() == "someString";
});

从增强文档中猜测,这将是:

std::find_if(m.begin(), m.end(), 
    return boost::lambda::_1.second.second == "someString");