4

コンテナー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},
  //...
}

私はそれを宣言の3番目のパラメータとして入れようとしました<int,int,decltype(countSetBits)>が、うまくいきませんでした。

4

4 に答える 4

8

次のように、関数を二項演算子でラップする必要があります。

#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のデモです。3 には 2 つのビットが設定されているのに対し、128 には 1 つしか設定されていないため、128 は 3 より先に正しく順序付けされます。

于 2013-03-23T15:26:39.910 に答える
1

基本的に、これは必要に応じて機能します。

bool comp(int x , int y ){
    return  __builtin_popcount(x) <  __builtin_popcount(y);
}
int main(){
    bool(*fn_pt)(int,int) = comp;
    std::map<int, int, bool(*)(int,int) > myMap (fn_pt);
    myMap[7]=11;
    myMap[8]=12;
    cout<<myMap.begin()->first<<endl;  // you get 8 instead of 7
}
于 2013-03-23T15:32:04.667 に答える