c++ stl ropes

c++ - Cuerda STL-cuando y donde usar



ropes (5)

Las cuerdas son una implementación de cadena escalable: están diseñadas para una operación eficiente que involucra a la cadena en su totalidad. Las operaciones como asignación, concatenación y subcadena llevan un tiempo que es casi independiente de la longitud de la cadena. A diferencia de las cadenas C, las cuerdas son una representación razonable de cadenas muy largas, como buffers de edición o mensajes de correo.

Ventajas :

  1. Operaciones de concatenación y subcadenas mucho más rápidas que implican cadenas largas. La inserción de un carácter en el medio de una cuerda de 10 megabytes debe tomar del orden de 10 segundos de microsegundos, incluso si se guarda una copia del original, por ejemplo, como parte de un historial de edición. En contraste, esto tomaría el orden de un segundo para la representación convencional de cuerdas "planas". El tiempo requerido para la concatenación puede verse como constante para la mayoría de las aplicaciones. Es perfectamente razonable usar una cuerda como representación de un archivo dentro de un editor de texto.

  2. Potencialmente mucho mejor rendimiento espacial. Modificaciones menores de una cuerda pueden compartir la memoria con el original. Las cuerdas se asignan en trozos pequeños, lo que reduce significativamente los problemas de fragmentación de memoria introducidos por grandes bloques.

  3. La asignación es simplemente una asignación de puntero (posiblemente referencia contada). A diferencia de las implementaciones de copia en escritura con referencia, esto sigue siendo en gran parte cierto incluso si una de las copias se modifica ligeramente posteriormente. Es muy económico controlar las versiones antiguas de una cadena, por ejemplo, en un historial de edición.

  4. Es posible ver una función que produce caracteres como una cuerda. Por lo tanto, una pieza de una cuerda puede ser un archivo de 100 MB, que se lee solo cuando se examina esa sección de la cadena. Concatenar una cadena al final de dicho archivo no implica leer el archivo. (Actualmente la implementación de esta facilidad está incompleta).

https://wayback.archive.org/web/20130102093702/https://www.sgi.com/tech/stl/Rope.html

Me preguntaba bajo qué circunstancias usarías una cuerda sobre otro contenedor STL.


Aquí se pone mucho énfasis en las cadenas compuestas por caracteres, pero la cuerda es simplemente una secuencia 1D con inserciones y eliminaciones rápidas (en cualquier lugar dentro de la secuencia).

Parece un poco sorprendente que tal capacidad básica rara vez se requiera para algo (excepto cadenas). ¿Dónde usaría una cuerda de números enteros? No lo sé, porque manipularlo requiere que los índices provengan de algún lado.

El mejor ejemplo del mundo real podría ser cuando estoy creando una IU para permitirle al usuario ver un conjunto de datos compuesto por miles de imágenes, y el usuario debe poder eliminar algunas de ellas y reorganizar el orden de las otras.


Es una alternativa no estándar a la string que maneja tamaños de datos grandes. Vea here cómo funciona.


Lo único malo con cuerdas es hilos y mal uso.

Bajo Linux (y probablemente la mayoría de los otros sistemas operativos) se dice que el código de seguridad de subprocesos es lo que hace que los cables sean mucho más lentos. Así que simplemente extraigo ese código (configuro una definición de compilador para subprocesos ), porque estoy usando un solo hilo en una plataforma incrustada.

De lo contrario, las cuerdas son mucho más rápidas que las cadenas, tienen menos probabilidades de salir de la memoria en búferes grandes y son mucho más rápidas para la edición de búferes grandes; Como quitar un mal carácter en el medio de la Biblia.

Esto se debe a la forma en que una cuerda se interpreta como datos. Como un montón de pequeñas cadenas más pequeñas encadenadas a través de una lista enlazada para producir la cadena final.


No lo usaría en absoluto, pero eso es porque soy un fenómeno de "fácil portabilidad", y solo tiendo a usar contenedores estándar de bog. El cable es parte de la implementación de STL de SGI y no es parte del estándar C ++.