No lo hace de forma predeterminada. Deberá proporcionar un comparador personalizado como tercer argumento. Siguiente fragmento le ayudará a ...
/************************************************************************/
/* Comparator for case-insensitive comparison in STL assos. containers */
/************************************************************************/
struct ci_less : std::binary_function<std::string, std::string, bool>
{
// case-independent (ci) compare_less binary function
struct nocase_compare : public std::binary_function<unsigned char,unsigned char,bool>
{
bool operator() (const unsigned char& c1, const unsigned char& c2) const {
return tolower (c1) < tolower (c2);
}
};
bool operator() (const std::string & s1, const std::string & s2) const {
return std::lexicographical_compare
(s1.begin(), s1.end(), // source range
s2.begin(), s2.end(), // dest range
nocase_compare()); // comparison
}
};
Se usa como std::map< std::string, std::vector<std::string>, ci_less > myMap;
NOTA: std :: lexicographical_compare tiene algunos detalles esenciales. La comparación de cadenas no siempre es sencilla si se consideran configuraciones regionales. Ver this thread en c.l.C++ si está interesado.
ACTUALIZACIÓN: Con C++ 11 std::binary_function
está en desuso y no es necesario ya que los tipos se deducen automáticamente.
struct ci_less
{
// case-independent (ci) compare_less binary function
struct nocase_compare
{
bool operator() (const unsigned char& c1, const unsigned char& c2) const {
return tolower (c1) < tolower (c2);
}
};
bool operator() (const std::string & s1, const std::string & s2) const {
return std::lexicographical_compare
(s1.begin(), s1.end(), // source range
s2.begin(), s2.end(), // dest range
nocase_compare()); // comparison
}
};
@Abhay. Gracias por tu respuesta. Sin embargo, no estoy del todo seguro de cómo funciona esto realmente (siendo relativamente nuevo en STL). ¿Cómo es que la definición de un tercer parámetro, que es una función de comparación o un objeto de función que hace "insensible a mayúsculas y minúsculas" menor que, en realidad hace una comparación insensible a mayúsculas y minúsculas. ¿No deberíamos usar el operador == en su lugar? ¿Cómo funciona esto realmente? Estoy seguro de que estoy perdiendo algo. – Ankur
@Ankur: std :: map generalmente se implementa como algún tipo de estructura de árbol. El método find() usa la función de comparación que se usa para ordenar (un elemento que no viene antes ni después se considera igual - a.k.una ordenación débil estricta) el árbol. Esto permite que la búsqueda se realice en tiempo O (logN) usando la estructura de árbol del mapa. El objeto predicado es muy parecido a una función de clasificación; su operador() toma un MyMap :: value_type & como referencia, y devuelve verdadero si el elemento coincide con su criterio de búsqueda. – Abhay
@Ankur: Además, de acuerdo con la firma std :: map std :: map, 'Compare' es un 'Strict Weak Ordering' cuyo tipo de argumento es Key. Y el árbol está construido usando este orden. Para ver qué es exactamente el ordenamiento estricto-débil en términos matemáticos, lea este artículo simplificado de SGI @ http://www.sgi.com/tech/stl/StrictWeakOrdering.html –
Abhay