使用lambda函数作为std :: map的比较

时间:2016-03-03 15:06:12

标签: visual-studio c++11 lambda

在VS2015中我为什么要这样做

typedef std::pair<std::set<std::string>::const_iterator,std::set<std::string>::const_iterator> paircmpiter;
struct PairCmp {
    bool operator()(const paircmpiter& lhs, const paircmpiter& rhs) const {
        return (*lhs.first + *lhs.second) < (*rhs.first + *rhs.second);
    }
};
std::map <paircmpiter,std::vector<std::pair<std::set<std::string>::const_iterator, int>>, PairCmp> markov;

但不是这个

auto paircmp = [](const paircmpiter& lhs, const paircmpiter& rhs) {
    return (*lhs.first + *lhs.second) < (*rhs.first + *rhs.second);
};
std::map <paircmpiter,std::vector<std::pair<std::set<std::string>::const_iterator, int>>, decltype(paircmp)> markov;

我原以为decltype允许我使用lambda函数作为比较。

如何使用lambda语法使其工作?

1 个答案:

答案 0 :(得分:1)

您收到编译错误,因为closure objects created by lambda expressions are not default-constructible。但它们是可复制构建的。

要修复,您需要将闭包对象传递到std::map constructor that takes a Compare object

std::map<
    paircmpiter,
    std::vector<std::pair<std::set<std::string>::const_iterator, int> >,
    decltype(paircmp)
    > markov{paircmp}; // <--- here