如何在 std::map 声明中声明自定义排序函数?

新手上路,请多包涵

容器 std::map 总是根据键的值对键进行排序。例如,是否可以根据声明时设置的位数对其进行排序?

我有一个计算设置位的功能:

 for(size_t i = 0; i < CHAR_BIT * sizeof value; ++i, value >>= 1) {
  if ((value & 1) == byteState) ++num_bits;
}

但是我不知道在声明地图时如何应用它:

 std::map<int, int> myMap = {
  {1,2},
  {3,4},
  //...
}

我试图将它作为声明中的第三个参数 <int,int,decltype(countSetBits)> ,但没有运气。

原文由 rsk82 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 814
1 个回答

您需要将函数包装在二元运算符中,如下所示:

 #include <iostream>
#include <map>
#include <algorithm>

int cntBits(int value) {
    int num_bits=0;
    for(size_t i = 0; i < 32 ; ++i, value >>= 1) {
        if ((value & 1) == 1) ++num_bits;
    }
    return num_bits;
}

struct cntBitsCmp {
    bool operator()(int a, int b) {
        return cntBits(a) < cntBits(b);
    }
};

现在您可以在声明中使用 cntBitsCmp

 std::map<int,int,cntBitsCmp> myMap= {
    {128,2},
    {3,4},
    ...
};

这是 关于 ideone 的演示。它正确地将 128 排在 3 之前,因为 3 设置了两位,而 128 只有一位。

原文由 Sergey Kalinichenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题