STL Rope: quando e dove usare

Mi stavo chiedendo in quali circostanze avresti usato una corda su un altro container STL?

Le corde sono un’implementazione di stringa scalabile: sono progettate per operazioni efficienti che coinvolgono la stringa nel suo complesso. Operazioni quali assegnazione, concatenazione e sottostringa richiedono un tempo quasi indipendente dalla lunghezza della stringa. A differenza delle stringhe C, le corde sono una rappresentazione ragionevole per stringhe molto lunghe come buffer di modifica o messaggi di posta.

Vantaggi :

  1. Operazioni di concatenazione e sottostringa molto più veloci con stringhe lunghe. L’inserimento di un personaggio nel mezzo di una corda da 10 megabyte dovrebbe assumere l’ordine di 10 secondi di microsecondi, anche se viene mantenuta una copia dell’originale, ad esempio come parte di una cronologia di modifica. Al contrario, ciò richiederebbe l’ordine di un secondo per la rappresentazione di stringa “piatta” convenzionale. Il tempo richiesto per la concatenazione può essere considerato costante per la maggior parte delle applicazioni. È perfettamente ragionevole usare una corda come rappresentazione di un file all’interno di un editor di testo.

  2. Prestazioni spaziali potenzialmente migliori. Le modifiche minori di una corda possono condividere la memoria con l’originale. I cavi vengono allocati in piccoli blocchi, riducendo in modo significativo i problemi di frammentazione della memoria introdotti da blocchi di grandi dimensioni

  3. L’assegnazione è semplicemente un’assegnazione del puntatore (eventualmente conteggiata conteggiata). A differenza delle implementazioni copy-on-write conteggiate di riferimento, ciò rimane ampiamente vero anche se una delle copie viene successivamente leggermente modificata. È molto economico controllare le vecchie versioni di una stringa, ad esempio in una cronologia delle modifiche.

  4. È ansible visualizzare una funzione che produce caratteri come una corda. Quindi un pezzo di corda può essere un file di 100MByte, che viene letto solo quando viene esaminata quella sezione della stringa. La concatenazione di una stringa alla fine di tale file non implica la lettura del file. (Attualmente l’implementazione di questa funzione è incompleta.)

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

È un’alternativa non standard alla string che gestisce le dimensioni dei dati di grandi dimensioni. Vedi qui per come funziona.

L’unica cosa negativa con le corde è il filo e l’abuso.

Sotto Linux (e probabilmente la maggior parte degli altri SO) si dice che il codice di sicurezza del thread è ciò che rende le corde molto più lente. Quindi ho appena strappato quel codice (imposta un def compilatore per thread-off ), perché sto usando un singolo thread in una piattaforma embedded.

In caso contrario, le corde sono molto più veloci delle stringhe, hanno meno probabilità di uscire dalla memoria su buffer di grandi dimensioni e sono molto più veloci per le modifiche di buffer di grandi dimensioni; Come rimuovere un personaggio cattivo nel mezzo della Bibbia.

Ciò è dovuto al modo in cui una corda viene interpretata come dati. Come un sacco di “stringhe” più piccole, incatenate insieme tramite una lista collegata per produrre la stringa finale.

Non lo userei affatto, ma è perché sono un po ‘un maniaco della “portabilità facile”, e tendono a usare solo contenitori standard. La corda fa parte dell’implementazione STL di SGI e non fa parte dello standard C ++.

C’è molta enfasi qui sulle stringhe composte da personaggi, ma la corda è semplicemente una sequenza 1D con inserimenti e cancellazioni veloci (ovunque all’interno della sequenza).

Sembra un po ‘sorprendente che una tale capacità di base sia raramente richiesta per qualsiasi cosa (diversa dalle stringhe). Dove dovrei usare una corda di numeri interi? Non lo so, perché manipolarlo richiede che gli indici vengano da qualche parte.

Il miglior esempio realistico del mondo reale sarebbe dove sto facendo un’interfaccia utente per consentire all’utente di visualizzare un set di dati composto da migliaia di immagini, e l’utente deve essere in grado di eliminarne alcune e riorganizzare l’ordine degli altri.