Estoy tratando de comparar std::string
s de forma dependiente de la configuración regional.ordenamiento dependiente de la configuración regional para std :: string
Para las cadenas estilo C ordinarios, he encontrado strcoll
, que hace exactamente lo que quiero, después de hacer std::setlocale
#include <iostream>
#include <locale>
#include <cstring>
bool cmp(const char* a, const char* b)
{
return strcoll(a, b) < 0;
}
int main()
{
const char* s1 = "z", *s2 = "å", *s3 = "ä", *s4 = "ö";
std::cout << (cmp(s1,s2) && cmp(s2,s3) && cmp(s3,s4)) << "\n"; //Outputs 0
std::setlocale(LC_ALL, "sv_SE.UTF-8");
std::cout << (cmp(s1,s2) && cmp(s2,s3) && cmp(s3,s4)) << "\n"; //Outputs 1, like it should
return 0;
}
Sin embargo, me gustaría tener este comportamiento para std::string
también. Yo podría sobrecargar operator<
hacer algo como
bool operator<(const std::string& a, const std::string& b)
{
return strcoll(a.c_str(), b.c_str());
}
pero entonces tendría que preocuparse de código usando std::less
y std::string::compare
, por lo que no se siente bien.
¿Hay alguna manera de que este tipo de intercalación funcione para las cadenas de manera uniforme?
Eso es práctico. Hace que las colecciones estándar funcionen sin esfuerzo. El operador – CAdaker