2

重複の可能性:
std::map キークラスが有効なキーであるために満たさなければならない要件は何ですか?

std::mapクラスから別のクラスへのマップとして使用したい。次のコードを試すと、エラー " undefined operator <" が発生します。K使用するクラスの順序が必要だということmapですか? そして、それは完全な注文でなければなりませんか?また、4 つの順序演算子すべてが必要ですか、それとも>十分ですか?

#include <iostream>
#include <map>
#include <stdio.h>
using namespace std;

struct K {
    int i, j;

    K(int i, int j) : i(i), j(j){}

    friend bool operator==(const K& x, const K& y){ return (x.i==y.i)&&(x.j==y.j); }
    friend bool operator!=(const K& x, const K& y){ return !(x==y); }

/*  friend bool operator<(const K&x, const K&y){
        if(x.i<y.i) return true;
        if(x.i>y.i) return false;
        return x.j<y.j;
    }
    friend bool operator>(const K&x, const K&y){ return y<x; }
    friend bool operator<=(const K&x, const K&y){ return !(y<x); }
    friend bool operator>=(const K&x, const K&y){ return !(x<y); }
*/
};


int main(){
    map<K, float> m;
    m[K(1,2)]=5.4;
    if(m.find(K(1,2))!=m.end())
        cout << "Found: " << m[K(1,2)] << endl;
    else
        cout << "Not found" << endl;
    return 0;
}
4

4 に答える 4

5

はいoperator<、 std::map を使用するには、要素 ( ) を比較する方法が必要です。map の機能の 1 つは、コンテンツをソートされた順序で保持することですが、これを実現するには、項目を比較する方法を知る必要があります。

比較方法を実装するには、次の 3 つのオプションがあります。

  1. operator<K で定義を追加
  2. comp2 つの K 要素を比較する方法を知っているファンクターを作成し、これをテンプレート パラメーターとして追加しますmap<K, float, comp> m

    struct comp {
        bool operator()(const K& first, const K& second) {
            /*****/
        }
    };
    
  3. K の std::less 特殊化を定義できます

    template<>  struct less<K>
    {
        bool operator()(const K& first, const K& second) {
            /*****/
        }
    };
    

そしてシンプルな使い方map<K, float> m;

これは、map のテンプレート定義によって比較関数が std::less に設定されているため機能します。

template < class Key, class T, class Compare = less , class Allocator = allocator > > クラスマップ

于 2012-10-16T13:37:09.183 に答える
4

マップ内の要素は、指定した Key タイプの比較関数によって参照されます。3 番目のテンプレート引数として暗黙的std::lessまたは明示的に。

カスタム キー タイプを使用する場合は、キーに厳密な弱い順序付けを課す適切な比較関数 (または機能オブジェクト) も提供する必要があります。つまり、キーが等しいように見える場合

!(key1 < key2 || key2 < key1)

アイテムは同等と見なされます。

したがって、比較関数がキーの半順序のみを提供する場合、実際には異なる要素が等しいと見なされる可能性があり、その結果、それらの値が互いに干渉する可能性があります。

于 2012-10-16T13:51:03.657 に答える
0

定義するだけoperator<

それ以外はstd::map注文の目的上不要です。

于 2012-10-16T13:38:45.033 に答える
-2

std :: mapには、単に演算子<が必要です。実装では通常、<演算子のみを必要とするように構築できる「赤黒」ツリーを使用します。

ただし、std :: unordered_mapは、今とまったく同じように使用できます。通常、一般的なハッシュ関数を使用します。C ++ 11以降の問題空間に適している場合は、独自のハッシュ関数を自由に提供できます。

于 2012-10-16T13:41:32.927 に答える