2009-07-09 12 views
34

Disculpe las llamas std :: string y std :: wstring. Son bastante limitados y están lejos de ser seguros para hilos. En cuanto al rendimiento, tampoco son tan buenos. Extraño características simples:Buena biblioteca de manipulación de cadenas C++

  1. Separar una cadena en una matriz/vector/lista de
  2. simple & intuitiva entre mayúsculas y minúsculas encontrar & reemplazar
  3. soporte para i18n sin preocuparse de cuerda o wstring
  4. Conversión ay de int, float, doble conversión
  5. hacia y desde UTF-8, UTF-16 & otras codificaciones
  6. hilo de seguridad/reentrante
  7. Ocupa poco espacio & sin dependencias
  8. altamente portátil & multiplataforma

que he encontrado Qt QString para ser útil y también encontré CBString http://bstring.sourceforge.net/bstrFAQ.shtml

¿Alguna otra sugerencia & comparaciones? Gracias.

Respuesta

9

El C++ String Algorithms Library de Boost tiene prácticamente todas las características que necesita.

+3

Gracias John. He hecho mi tarea antes de publicar aquí. No es simple ni intuitivo. Fallé la función de división porque no tiene una opción para devolver cadenas vacías. – Viet

+0

¡Ahh, me has vencido! También agregaría que hay una variedad de otras bibliotecas de Boost relacionadas con la manipulación de cadenas además de los algoritmos de cadenas. Aquí hay un enlace (http://www.boost.org/doc/libs?view=category_String) a la categoría. – SingleNegationElimination

+0

Gracias TokenMacGuy :) – Viet

1

Para la conversión, siempre puede descomponer y utilizar la biblioteca C cstdlib.

#include <cstlib> 
#include <iostream> 

int main() 
{ 
    std::string num; 

    std::cin >> num; 

    someFunc(atoi(num)); 
    someOtherFunc(atof(num)); 
    return 0; 
} 

atoi = ascii a entero atof = ascii para flotar

cuanto a encontrar, utilizar la función STL "find" se define en el algoritmo de cabeza, o find_first_of (o similar). También creo que puedes inicializar un vector de char con std :: string, pero eso es una conjetura.

+0

Claro, pero eso es incómodo. La funcionalidad realmente debería estar disponible en el nivel de la biblioteca C++, pero no necesariamente en la cadena misma. –

+0

Gracias, pero también necesito compatibilidad con mayúsculas/minúsculas i18n. – Viet

+0

No estoy seguro de lo que quieres decir. ¿Qué quieres decir con la cadena en sí? – jkeys

3

Bstring - Aunque nunca lo intenté yo mismo, el conjunto de funciones y la velocidad se presentaron en su sitio. Bajo su elección de licencia GPL o BSD también es un buen grado de libertad.

Además, el nombre sugiere que es mejor, ¿cómo pueden mentir? :)

+0

Hsieh también escribió SuperFastHash, que resulta que no es tan rápido. Murmur2 es más rápido y está mejor distribuido. –

+0

Gracias. Encontré esta lib en mi consulta :) – Viet

+1

Bstrlib no es compatible con Unicode. – anno

10

No estoy seguro de que estoy de acuerdo. Las cadenas realmente no deberían ser seguras para hilos debido a la sobrecarga, excepto para el recuento de referencias, si corresponde. La mayor parte de la otra funcionalidad que desea convertiría cadenas en una barcaza de basura. Del mismo modo, eliminar las dependencias eliminaría su capacidad de funcionar bien con las transmisiones.

Lo único que sugeriría es que podríamos beneficiarnos de una clase de cadena inmutable, particularmente una que no tiene la propiedad de la memoria o la terminación. Ya los escribí antes y pueden ser muy útiles.

+0

Gracias Steven. Pero la manipulación de cadenas realmente me molesta. Necesito mucho para el procesamiento de cadenas en C++. En PHP, Perl y Python puedo hacer cosas sin esfuerzo, pero me cuesta hacerlo en C++. – Viet

+1

Estos son lenguajes de script ... –

+4

Pero tienen motores subyacentes en C :) Y su razón no es buena para evitar tener una buena y poderosa biblioteca de manipulación de cadenas en C & C++. – Viet

2

Encontré wxString cómodo de usar y tiene muchas características. Aunque es parte de una biblioteca más grande (wxWidgets) y tal vez demasiado grande cuando solo quieres usar cadenas. También funciona sin componentes de GUI cuando solo usa wxBase que contiene el wxString y unos 'otros' componentes.

EDITAR: aquí hay un link a la documentación.Acepta las funciones estándar de std :: string y también algunas otras. Siempre encuentro que BeforeFirst() y AfterFirst() siempre son muy convenientes cuando tengo que analizar texto. Y está realmente bien documentado.

+0

Gracias por su sugerencia, ¡rve! – Viet

26

La biblioteca C++ String Toolkit (StrTk) es una biblioteca gratuita que consiste en algoritmos y procedimientos robustos, optimizados y portátiles de procesamiento de cadenas genéricas para el lenguaje C++. La biblioteca está diseñada para ser fácil de usar e integrar dentro del código existente.

la biblioteca tiene las siguientes capacidades:

  • tokenizer cadena genérica e iteradores de tokens
  • Dividir rutinas
  • delimitadores especificados por el usuario y el divisor de políticas (simples y basados ​​etc. expresiones regulares)
  • Las conversiones entre datos y hex y base-64
  • rutinas de eliminación in situ y reemplazo
  • Wild-ca rd a juego y globing
  • procesamiento rejilla símbolo
  • plantillas de procesamiento de cadenas extensibles
  • 2D rápido

y mucho más ...

compatibles compiladores de C++:

  • GCC 4.0 +
  • Compilador Intel C++ 9.0+
  • Microsoft Visual C++ 8.0 o superior
  • Comeau C/C++ 4.1+

Fuente:

+22

Buen descubrimiento. Gracias :) Voy a echar un vistazo. – Viet

1

le recomiendo usar ICU 's UnicodeString, ya que admite todas las funciones comunes de manipulación de cadenas, así como el soporte i18n.

¿No sabe qué es la UCI? He aquí un extracto de Wikipedia:

Componentes internacionales para Unicode (UCI) es un proyecto de código abierto de C madura/C++ y bibliotecas Java para el soporte Unicode, la internacionalización de software, el software y la globalización. La UCI es ampliamente portátil para muchos sistemas operativos y entornos. Le da a las aplicaciones los mismos resultados en todas las plataformas y entre el software C, C++ y Java. El proyecto ICU está patrocinado, respaldado y utilizado por IBM y muchas otras compañías.

Cuestiones relacionadas