Tipo complejo C ++ como valor clave de unordered_map

unordered_map y unordered_set

Sabemos que hay dos estructuras de datos de unordered_map y unordered_set en C ++, y su implementación interna es una tabla hash, que requiere que el tipo de valor clave debe ser hash, como tipos de datos comunes int, string, etc. Pero en muchas aplicaciones, es posible que necesitemos usar tipos más complejos como valores clave, como vector <int>, pair <int, int> o incluso clases personalizadas. En este momento, necesitamos escribir manualmente dos clases para crear los datos Echemos un vistazo a los parámetros del objeto de estructura.

Ahora quiero que el par <int, int> sea el valor clave de unorderd_map. Necesito escribir dos clases. Cada clase contiene una función. La función en la primera clase se llama función hash. Establecer un par <int, El objeto de int> es hash y se devuelve su valor hash; la segunda se llama función de igualdad, que se usa para determinar si dos pares de objetos <int, int> son iguales, lo que tiene como objetivo resolver conflictos.

ps: la clase y la estructura son realmente similares y se pueden usar en lugar de la otra

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;
    }
};

La implementación específica de estas dos clases depende completamente de usted, pero debe prestar atención, porque estas dos clases se pasan a unordered_map como parámetros, por lo que se deben cumplir ciertas reglas al definirlas. Por ejemplo, el valor de retorno de Hashfunc es size_t. La función de juicio en Equalfunc debe agregar un campo constante.

Después de escribir las dos clases anteriores, pásalas al objeto de estructura de datos que se creará y luego podrás usarlo.

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

mapa y conjunto

Lo anterior trata sobre la aplicación de unordered_map y unordered_set. ¿Qué pasa con map y set? Sabemos que la implementación interna de map y set es un árbol. Dado que se usa el árbol de búsqueda binario, debe haber una manera de comparar el tamaño de los dos elementos. El par <int, int> y el vector <int> mencionados anteriormente, parece que map se proporciona automáticamente Déle un método de comparación, para que pueda usarse directamente como un valor clave sin tener que definir la clase usted mismo.

¿Cuándo necesitas definir tu propia clase? La respuesta es cuando se usa una clase personalizada como valor clave. Similar a lo anterior, ahora definimos una clase, la función en la clase también le damos un nombre, llamémosla función menor que, esta función se usa para determinar el tamaño de los dos valores del elemento.
como sigue:

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;

Supongo que te gusta

Origin blog.csdn.net/weixin_43867940/article/details/105775739
Recomendado
Clasificación