繁体   English   中英

C++ class 成员的用户定义比较器

[英]User defined comparator for member of C++ class

我有一个关于以下代码的快速问题:

#include <iostream>
#include <string>
#include <map>

using namespace std;

struct mySet{
    
    mySet(){
    }

    auto compare = [](int a, int b){ return a > b; };
    
    map<int, int, bool(*)(int, int)> myMap(compare);
    
    void insert(int x){
        if(myMap.find(x) == myMap.end()) myMap[x] = 1;
        else myMap[x]++;
    }
    
    void output(){
        for(auto p : myMap) cout << p.first << " " << p.second << endl;   
    }
};

int main()
{
  mySet thing;
  thing.insert(1);
  thing.insert(2);
  thing.insert(1);
  thing.output();
}

这段代码引发了一个错误,我怀疑它围绕

    auto compare = [](int a, int b){ return a > b; };
    
    map<int, int, bool(*)(int, int)> myMap(compare);

我的理解是这不会编译,因为 compare 是 class 的成员,它需要一个实例才能被调用。

如果我将此代码替换为

    static auto compare = [](int a, int b){ return a > b; };

它仍然无法编译,因为它至少需要一个 mySet 实例才能调用 compare 。

我的问题是:

  1. 我的理解是否正确,或者 std::map 中的函数类型和比较器类型是否存在更险恶的情况?

  2. 是否有一个简单的解决方案来使用用户定义的比较器声明 class 的成员? 我最简单的想法就是将成员声明为

std::map<int, int, bool(*)(int, int)> myMap;

然后将 function 传递给构造函数,例如

mySet( bool(*f)(int, int) ){
     map<int, int, bool(*)(int, int)> newMap (f);
     myMap = newMap;
}

只是好奇是否有更简单的解决方案,并试图更好地理解正在发生的事情。

感谢和感谢任何帮助。

您不能使用auto声明非静态成员。

并且 static 非整数类型的非 constexpr 数据成员的类内初始化也不可能。

类内初始化不使用(){} (或= )(以避免令人烦恼的解析问题)

所以你可以使用:

static constexpr auto compare = [](int a, int b){ return a > b; };
    
std::map<int, int, bool(*)(int, int)> myMap{compare};

演示

或者在你的情况下,简单地说:

std::map<int, int, std::greater<int>> myMap;

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM