使用C ++ 11将我的compar函数传递给std :: multiset

时间:2014-09-11 01:01:36

标签: c++ c++11 stl lambda multiset

我有一个std :: multiset,它存储了std :: pair。我希望第一个属性对唯一性没有约束,但我希望第二个属性是唯一的。所以,我决定将自己的函数传递给multiset,以实现这一目标(如果不是,请告诉我)。

根据this回答,我写了一个类似的函数,但它失败了,我不知道为什么(不知道λ - 我是希腊语:))。

auto f = [](std::pair<float, int>& a, std::pair<float, int>& b) {
  return (a.first < b.first && a.second != b.second);
};

错误:

error: expression ‘#‘lambda_expr’ not supported by dump_expr#<expression error>’ is not a constant-expression
sorry, unimplemented: non-static data member initializers
error: unable to deduce ‘auto’ from ‘<expression error>’

2 个答案:

答案 0 :(得分:6)

由于您使用的是multiset,而不是set,因此仍然会将多个比较相等的密钥存储在容器中,因此我不确定您的意思当你谈论独特性时。

假设您只想让pair中的第二个元素影响排序,您可以使用lambda,如下所示:

auto f = [](std::pair<float, int> const& a, std::pair<float, int> const& b) {
  return a.second < b.second;
};
std::multiset<std::pair<float, int>, decltype(f)> m(f);

Live demo

答案 1 :(得分:4)

我认为你不能将lambda(运行时构造)作为模板参数(编译时构造)传递。使用带operator()的结构代替:

#include <set>
struct my_compare {
  bool operator() (const std::pair<float, int>& a, const std::pair<float, int>& b) {
    return (a.first < b.first && a.second != b.second);
  };
};
int main(int argc, char ** argv) {
  std::multiset<std::pair<float, int>, my_compare> set;
  return 0;
}

或者,使用lambda和decltype(如Praetorian的答案):

#include <set>  
int main(int argc, char ** argv) {
  auto my_compare = [](const std::pair<float, int>& a, const std::pair<float, int>& b) {
    return (a.first < b.first && a.second != b.second);
  };
  std::multiset<std::pair<float, int>, decltype(my_compare)> set(my_compare);
  return 0;
}