0
class compare
{
    public:
    bool operator()(const int x,const int y) const
    {
        if(x-y == 0) 
            return false;
        else 
            return true; 
    }
};

int main()
{
    std::map<char,int,compare> mymap;

    //Add data into map
    mymap.insert ( std::pair<char,int>('f',100) );
    mymap.insert ( std::pair<char,int>('a',100) );
    mymap.insert ( std::pair<char,int>('k',100) );
    mymap.insert ( std::pair<char,int>('z',200) );

    //try to find a key in map
    std::map<char,int,compare>::iterator l_pos = mymap.begin();
    l_pos = mymap.find('z');

    if(l_pos != mymap.end())
    {
        printf("\nfound = %c\n",l_pos->first);
    }
    else
    {
        printf("Not found = %c\n",l_pos->first);
    }
}

結果:

Not found =

でも地図を表示すれば内容はわかる。mymap の内容: f => 100 a => 100 k => 100 z => 20

キーの並べ替えを停止するカスタム比較関数が記述されている場合、stl マップ内の検索は機能しません。検索は失敗します。これを修正する方法はありますか?Find はデータを返しません。私は stl マップがこの目的のためのものではないことを知っています。しかし、これを修正する方法はありますか?Compare 関数はソートを停止します。エントリは逆順に格納されます。for ループを使用してマップを反復処理すると、すべての値が表示されます。機能していないのは find コマンドだけです。

4

2 に答える 2

1

ファンクターcompareが壊れています。

Amapはコンパレータを使用して厳密な弱い順序付けを実装します。

23.1.2 連想コンテナ

各連想コンテナーは、Key と、Key の要素に対して厳密な弱い順序付け (25.3) を誘導する順序付け関係 Compare でパラメーター化されます。

関数compare()はこれを行わないため、未定義の動作が発生します。ここで壊れているわけではありませんmapが、それを使用しているため、再実装する以外にこれを「修正」する方法はなくcompare()、要素に厳密な弱い順序付けを誘導するか、map.

于 2013-05-29T13:48:01.420 に答える
0

std::map 比較演算子は厳密な弱い順序付けを実装する必要があり、コンパレーターがそれらの要件を実装しない場合、動作は未定義です。あなたが持っている比較でマップを機能させることはできません。

おそらく、解決しようとしている実際の問題について詳しく説明していただければ、私たちがお手伝いできることがあります。

于 2013-05-29T13:47:05.270 に答える