Non per impostazione predefinita. Dovrai fornire un comparatore personalizzato come terzo argomento. Seguente frammento vi aiuterà 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
}
};
Usalo come std::map< std::string, std::vector<std::string>, ci_less > myMap;
NOTA: std :: lexicographical_compare ha alcuni dettagli essenziali. Il confronto tra stringhe non è sempre semplice se si considerano locali. Vedere il thread this su c.l.C++ se interessato.
UPDATE: Con C++ 11 std::binary_function
è obsoleto e non è necessario in quanto i tipi vengono dedotti automaticamente.
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. Grazie per la tua risposta. Tuttavia, non sono del tutto sicuro di come funzioni effettivamente (essendo relativamente nuovo a STL). Come si definisce un terzo parametro, che essendo una funzione di confronto o un oggetto funzione che fa "maiuscole e minuscole" meno di, in realtà fa un confronto insensibile al maiuscolo/minuscolo. Non dovremmo usare invece l'operatore ==. Come funziona davvero? Sono sicuro che sto prendendo in giro qualcosa. – Ankur
@Ankur: std :: map viene solitamente implementato come una sorta di struttura ad albero. Il metodo find() usa la funzione di confronto che viene utilizzata per l'ordinamento (un elemento che non viene né prima né dopo è considerato uguale - a.k.a rigoroso ordinamento debole) dell'albero. Ciò consente di eseguire la ricerca in tempo O (logN) utilizzando la struttura ad albero della mappa. L'oggetto predicato è molto simile a una funzione di ordinamento; il suo operatore() accetta MyMap :: value_type & come riferimento, e restituisce true se l'elemento corrisponde al criterio di ricerca. – Abhay
@Ankur: Inoltre, come per std :: firma della mappa std :: map, 'Compare' è un 'Ordinamento debole rigoroso' il cui tipo di argomento è Key. E l'albero è costruito usando questo ordine. Per vedere cosa è esattamente l'ordinamento rigoroso-debole in termini matematici, leggi questa semplice scrittura SGI @ http://www.sgi.com/tech/stl/StrictWeakOrdering.html –
Abhay