unordered_mapのキー値としてのC ++複合型

unordered_map&unordered_set

C ++にはunordered_mapとunordered_setの2つのデータ構造があり、その内部実装はハッシュテーブルであることがわかっています。そのため、共通のデータ型int、stringなど、キー値の型がハッシュ可能である必要があります。しかし、多くのアプリケーションでは、vector <int>、pair <int、int>、さらにはカスタムクラスなど、より複雑なタイプをキー値として使用する必要がある場合があります。現時点では、データを作成するために2つのクラスを手動で記述する必要があります構造オブジェクトのパラメーターを見てみましょう。

ここで、pair <int、int>をunorderd_mapのキー値にしたいと思います。2つのクラスを作成する必要があります。各クラスには関数が含まれています。最初のクラスの関数はハッシュ関数と呼ばれます。pair<int、 int>のオブジェクトがハッシュされ、そのハッシュ値が返されます。2番目の関数は等価関数と呼ばれ、2つのpair <int、int>オブジェクトが等しいかどうかを判断するために使用されます。これは、競合を解決するためのものです。

ps:クラスと構造は実際には類似しており、互いに代わりに使用できます

struct Hashfunc {
    
    
    size_t operator() (const pair<int,int>& key) const{
    
    
        return hash<int>()(key.first) ^ hash<int>()(key.second);
    }
};
struct Equalfunc {
    
    
    bool operator() (const pair<int,int>& a, const pair<int,int>& b) const{
    
    
        return a.first == b.first && a.second == b.second;
    }
};

これらの2つのクラスの具体的な実装は完全に自由ですが、これらの2つのクラスはパラメーターとしてunordered_mapに渡されるため、それらを定義するときに特定のルールを満たす必要があるため、注意が必要です。たとえば、Hashfuncの戻り値はsize_tです。 Equalfuncの判定関数はconstフィールドを追加する必要があります。

上記の2つのクラスを書き込んだ後、作成するデータ構造オブジェクトに渡して、使用できるようにします。

unordered_map<pair<int,int>, int, Hashfunc, Equalfunc> mp;

地図と設定

上記はunordered_mapとunordered_setの適用についてですが、マップとセットについてはどうですか?mapとsetの内部実装はツリーであることはわかっています。バイナリ検索ツリーが使用されているため、2つの要素のサイズを比較する方法が必要です。上記のpair <int、int>とvector <int>は、マップが自動的に提供されるようです比較の方法を提供するので、自分でクラスを定義する必要なく、キー値として直接使用できます。

いつ独自のクラスを定義する必要がありますか?答えは、カスタムクラスをキー値として使用する場合です。上記と同様に、クラスを定義します。クラス内の関数にも名前を付けます。これを「より小さい」関数と呼びます。この関数は、2つの要素の値のサイズを決定するために使用されます。
次のように:

class T {
    
    
	public:
	int a,b;
	T(int c, int d) {
    
    
		a = c;
		b = d;
	}
};
struct Tless {
    
    
	bool operator() (const T& a, const T& b) {
    
    
		return a.a < b.a;
	}
};
map<T, int, tless> mp2;

おすすめ

転載: blog.csdn.net/weixin_43867940/article/details/105775739