Newsgroup: it.comp.lang.c++
Titolo: incredibile!(confronto stringhe)

Salve.
Ho dato un'occhiata alla Standard C++ Library ...
l'ho trovata molto interessante sotto parecchi aspetti (certo, un po'
macchinosa da usare per piccole operazioni)...
ma c'č una cosa che mi chiedo, riguardo alle stringhe:
possibile che non esista un membro di string, o una funzione globale, o una
object function che permetta di eseguire un confronto tra due stringhe
"case-insensitive" ??
Sembrava troppo comodo ?? A me sembra che il confronto case-insensitive fra
stringhe sia una cosa molto comune, e pensavo fosse naturale implementare
una funzione che lo effettuasse...
In pratica mi sono dovuto creare una object function cosě definita (codice
preso da un post di Antonio Cuni del 25 marzo):
class comp_str_txt:public binary_function<string,string,bool>
{
private:
 struct comp_char_txt:public binary_function<char,char,bool>
 {
  bool operator()(char x,char y)
  {
   return toupper(x)<toupper(y);
  }
 };
public:
 bool operator()(const string& s1,const string& s2) const
 {
  return
std::lexicographical_compare(s1.begin(),s1.end(),s2.begin(),s2.end(),comp_ch
ar_txt());
 };
};
Se qualcuno fosse a conoscenza di una soluzione piů diretta e me ne
informasse gliene sarei grato. Grazie.
--
"Solo gli idioti non hanno dubbi."
"Ne sei sicuro?"
"Certo."
Georges Courteline

 stringhe "case-insensitive" ??
non esiste un modo "diretto" per il semplice fatto che non sempre la 
comparazione case-insensitive ha senso: noi siamo abituati all'alfabeto 
inglese dove esiste una corrispondenza biunivoca tra lettere minuscole e 
maiuscole, ma std::basic_string<> (il template padre di std::string) e` 
progettato per funzionare con qualsiasi set di caratteri, anche quelli 
per cui un confronto case-insensitive e` complicato o adirittura senza 
senso (ad esempio per certe lingue orientali).
Exceptional C++ di Sutter offre una panoramica del problema, mentre 
esiste un articolo di Matt Austern che lo tratta esaustivamente: si 
intitola "How to do case-insensitive string comparision" ed e` apparso 
per la prima volta sul C++ Report del Maggio 2000; forse lo trovi anche 
sul web e in ogni caso e` riportato anche in una appendice di "Effective 
STL" di Meyers.
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 preso da un post di Antonio Cuni del 25 marzo):
[snip code]
guarda se questo ti puo' aiutare:
http://www.josuttis.com/libbook/string/icstring.hpp.html

 ciao Anto
Ciao, Diego.

 
http://www.josuttis.com/libbook/string/icstring.hpp.html
Grazie, credo che quello riportato nel link sia un approccio molto
"standard" e corretto al problema... anche se non ho esaminato bene le
funzionalità ed il modo di utilizzo della classe char_traits<char>.
A proposito, ho letto che le std::string della libreria standard non sono in
realtà prese dalla STL. Ma io ho studiato l'implementazione sgi di
quest'ultima, e ne fa parte la classe basic_string (da cui con un typedef
deriva la string)... mi sono perso qualcosa ?

 deriva la string)... mi sono perso qualcosa ?
L'STL e' una libreria sviluppata in origine da A. Stepanov e altri
presso l'HP, poi "migrata" in SGI, che in origine non comprendeva la
classe string, di cui non conosco l'origine esatta.
Una buona parte dell'STL originale e' stata inclusa nello standard del
C++, cosi' come e' avvenuto per std::string. Poi la libreria SGI e'
evoluta in modo da implementare tutta o quasi la libreria standard. Di
qui la confusione.
Ciao,
Nicola

 Nicola
Ciao, Diego