2009-12-06 31 views
8

En pocas palabras, si la entrada está siempre en el mismo caso (aquí, minúscula), y si los caracteres son siempre ASCII, ¿se puede usar una cadena :: comparar para determinar confiablemente el orden alfabético de dos cadenas?¿Es la cadena :: comparar confiable para determinar el orden alfabético?

Por lo tanto, con stringA.compare(stringB) si el resultado es 0, son lo mismo, si es negativo, la cadena A aparece antes de la secuencia B alfabéticamente, y si es positiva, ¿viene la cadena A?

Respuesta

8

De acuerdo con los documentos en cplusplus.com,

La función miembro devuelve 0 si todo los caracteres en el contenido comparado son iguales, un valor negativo si el primer carácter que no coincide se compara con menos en el objeto que en el com cadena de pelado, y un valor positivo en el caso opuesto.

Por lo tanto, ordenará las cadenas en orden ASCII, que serán alfabéticas para cadenas en inglés (sin signos diacríticos u otros caracteres extendidos) del mismo caso.

+0

IIRC, los apóstrofes y los guiones no son signos diacríticos, ¿verdad? – MPelletier

+0

Correcto, ordenarán en orden ASCII. –

+1

Generalmente, al alfabetizar, uno no tiene en cuenta los signos de puntuación para determinar el orden, por lo que la puntuación debe eliminarse de las cadenas. En cualquier caso, el apóstrofo y el guión están debajo de los intervalos alfabéticos en ASCII. –

3

Sí, siempre que todos los caracteres en ambas cadenas sean del mismo caso, y siempre que ambas cadenas estén compuestas solo de letras, esto funcionará.

compare es una función miembro, sin embargo, por lo que lo llaman así:

stringA.compare(stringB); 
+0

Oh, a la derecha. ¡sí! Duh ... ¡Gracias por corregir mi sintaxis! – MPelletier

0

yes,

La función miembro devuelve 0 si todos los personajes de los contenidos en comparación comparan iguales, un valor negativo si el primer carácter que hace no coincidencia se compara con menos en el objeto que en la cadena de comparación, y un valor positivo en el caso opuesto.

Para objetos de cadena, el resultado de una comparación carácter depende sólo de su código de caracteres (es decir, su código ASCII ), por lo que el resultado tiene alguna alfabético limitada o pedidos numérica significado.

2

En C++, string es la creación de instancias de la clase de plantilla basic_string con los parámetros por defecto: basic_string<char, char_traits<char>, allocator<char> >. La función de comparación en la plantilla basic_string utilizará la función char_traits<TChar>::compare para determinar el valor del resultado.

Para std::string, el orden será el del código de carácter predeterminado para la implementación (compilador) y que generalmente es el orden ASCII. Si necesita un pedido diferente (digamos que desea considerar {a, á, à, â} como equivalente), puede instanciar un basic_string con su propia implementación char_traits<>. proporcionando un puntero de función compare diferente.

+0

¿Tiene un ejemplo para esto? – Marcello90

0

Las especificaciones para el lenguaje C y C++ garantizan el orden léxico, 'A' < 'B' < 'C' ... < 'Z'. Lo mismo es cierto para minúsculas.

El pedido de dígitos de texto también está garantizado: '0' < ... < '9'.

Al trabajar con varios idiomas, muchas personas crean una matriz de caracteres. La matriz se busca por el personaje. En lugar de comparar caracteres, los índices se comparan.

+0

El estándar de lenguaje C++ _no_ especifica un conjunto de caracteres de ejecución, y como tal, no está garantizado por el estándar de lenguaje que las letras estarán en dicho orden y, por lo tanto, depende de la implementación. –

Cuestiones relacionadas