Pregunta

Tengo un std :: multimap donde key es una clase personalizada. Algo como esto:

Class X {
public:
    std::string s;
    int x;
    operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;

Ahora, me gustaría usar upper_bound y lower_bound para iterar sobre todos los elementos con el mismo valor de " s " ;. ¿Necesito implementar algún otro operador para X (por ejemplo: ==). ¿O funcionará correctamente así?

Además, ¿qué debo proporcionar como argumento para upper_bound y lower_bound ? Supongo que debería crear un objeto ficticio con el valor deseado de & Quot; s & Quot ;?

¿Fue útil?

Solución

Dado que class X es la clave para el mapa múltiple, el parámetro para upper_bound() / lower_bound() debe ser de ese tipo. Si std::string tiene una conversión implícita de X::s (que es el tipo de less<>), puede usarla como parámetro para operator <() / <=>.

La comparación predeterminada para el mapa múltiple es <=> que simplemente llama a <=>, por lo que es el único operador que debe tener en <=> para que el mapa múltiple funcione.

Otros consejos

solo necesita proporcionar un operador == y < ;.

upper_bound y lower_bound son como cualquier otro método de tipo de búsqueda, por lo que necesita el mismo tipo de objeto para comparar, en su caso, un objeto 'ficticio' con el valor requerido de s.

edit : los comentarios son correctos y solo necesita el operador < para lower / upper_bound y find. Pero si desea llamar a otros métodos en su contenedor, también necesitará el operador ==. P.ej. si desea ordenar () su contenedor, necesitará el operador ==.

Las 2 sobrecargas que necesita para todos los contenedores STL son operator < y operador ==. Encuentro su mejor práctica para implementar ambos.

Por supuesto, la pregunta también podría responderse más completamente implementando un functor de comparación en el mapa en sí, sin depender de los objetos. Esta suele ser una buena manera de implementar diferentes formas de llamar a find () en el mapa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top