¿Cómo puedo crear un propio comparador para un mapa?

typedef map myMap; 

Al insertar un nuevo par en myMap , usará la string clave para comparar por su propio comparador de cadenas. ¿Es posible anular ese comparador? Por ejemplo, me gustaría comparar la string clave por su longitud, no por el alfabeto. ¿O hay alguna otra forma de ordenar el mapa?

std::map toma hasta cuatro argumentos de tipo de plantilla, el tercero es un comparador. P.ej:

 struct cmpByStringLength { bool operator()(const std::string& a, const std::string& b) const { return a.length() < b.length(); } }; // ... std::map myMap; 

Alternativamente, también puede pasar un comparador al constructor del map .

Sin embargo, tenga en cuenta que al comparar por longitud, solo puede tener una cadena de cada longitud en el mapa como clave.

Sí, el tercer parámetro de plantilla en el map especifica el comparador, que es un predicado binario. Ejemplo:

 struct ByLength : public std::binary_function { bool operator()(const string& lhs, const string& rhs) const { return lhs.length() < rhs.length(); } }; int main() { typedef map lenmap; lenmap mymap; mymap["one"] = "one"; mymap["a"] = "a"; mymap["fewbahr"] = "foobar"; for( lenmap::const_iterator it = mymap.begin(), end = mymap.end(); it != end; ++it ) cout < < it->first < < "\n"; } 

Desde C ++ 11 , también puede usar una expresión lambda en lugar de definir una estructura de comparación:

 auto comp = [](const string& a, const string& b) { return a.length() < b.length(); }; map my_map(comp); my_map["1"] = "a"; my_map["three"] = "b"; my_map["two"] = "c"; my_map["fouuur"] = "d"; for(auto const &kv : my_map) cout < < kv.first << endl; 

Salida:

1
dos
Tres
fouuur

Me gustaría repetir la nota final de la respuesta de Georg: Al comparar por longitud, solo puede tener una cadena de cada longitud en el mapa como clave.

Código en Ideone