Domanda È std :: string parte dell'STL?


(Quando dico STL, sto parlando della libreria di template che ruota attorno a contenitori, iteratori, algoritmi e funtori.)
Questa domanda mi è venuta in mente dopo aver pensato che a std::string per lo più si comporta come un normale contenitore, con begin e end funzioni (incluso iteratore), a size funzione e la possibilità di utilizzare tutti quelli per i normali algoritmi STL che funzionano su contenitori / intervalli attraverso i loro iteratori (ad es. transform, sort, find, eccetera.).

Allo stesso tempo, tuttavia, non è un contenitore stesso, in quanto non si adatta all'immagine di contenitori che memorizzano dati arbitrari. Inoltre, opera sui dati contenuti principalmente attraverso funzioni membro, come substr, find_first_of, ecc., mentre il vero contenitore non lo fa e lascia che gli algoritmi lo gestiscano.

Inoltre, il sito di riferimento cplusplus e lo standard C ++ non elenca std::string insieme ai contenitori reali, ma in una categoria distinta.
Tuttavia, via Sito STL di SGI, basic_string (e di conseguenza il string typedef) sono menzionati con l'altro contenitore e il basic_string sito di riferimento afferma che appartiene alla categoria "contenitori".

Ora la mia domanda è, è string in realtà parte dell'STL o è una libreria distinta?
E se ora appartiene alla STL, ha differito nel STL originale sviluppato da Stepanov?


37
2018-05-12 01:55


origine


risposte:


No, non proprio. E sì, un po '.

Esistono diverse definizioni di "STL", Compreso:

  • L'attuale STL HP / SGI, la libreria originale, su cui si basava la libreria standard C ++. Includevano contenitori, iteratori e algoritmi. Le stringhe erano non una parte di questo.

  • Le parti della libreria standard C ++ basate sulla libreria SGI STL: contenitori, iteratori e algoritmi. Ancora senza stringhe.

  • Tutta la libreria standard C ++. Questa definizione non ha assolutamente alcun fondamento nella logica o nella realtà, se seguita, std::string sarebbe incluso.

Si noti che l'effettivo STL si è sviluppato da quando il C ++ è stato standardizzato (circa 13 anni fa, ricorda), e hanno fatto marcia indietro - ha adottato alcune delle cose che sono andate nello standard, come le stringhe. Questo fa non significa che erano originariamente lì nel 1998 ... ma ora ci sono per ragioni di "compatibilità".


Sommario

STL era contenitori, algoritmi e iteratori.

Stringhe e flussi sono stati adottati per C ++ 98, quindi indietro-adatto per il moderno SGI STL.

Se le stringhe sono "parte dell'STL" o meno dipende dal fatto che si seguano la logica e la ragione o si chiami la libreria standard "STL".

Spero che questo ti aiuti.


28
2018-05-12 02:12



Non c'è una vera risposta a questo. Da una parte, std::string è stato sviluppato interamente indipendentemente dagli altri contenitori. D'altra parte, è stato aggiunto abbastanza per soddisfare tutti i requisiti di un contenitore ad accesso casuale. Che tu scelga di classificarlo come parte di "STL" o meno dipende interamente da te - alla fine, indica semplicemente che "STL" manca di una singola definizione concordata e le possibilità che si verifichino improvvisamente ottenere un significato chiaro è remoto (per dirla bene).

IOW, "STL" è un'abbreviazione abbreviata da usare perché le persone lo usano per significare almeno tre cose diverse - ma, sfortunatamente, non c'è un'abbreviazione migliore con un significato ben definito, quindi STL rimane in uso e probabilmente continuerà a fallo (e continua a ostacolare la comunicazione) a tempo indeterminato.


10
2018-05-12 02:07



Fa parte di STL davvero. E std :: string è solo basic_string typedef. È contenitore, specializzato (non in c ++ "specializzazione" che significa :)) per l'archiviazione dei dati con semantica delle stringhe. Nessuna idea di Stepanov però. Vale la pena ricordare che STL è "Libreria di modelli standard", non solo sottoparte container. Ciò include algoritmi, flussi e alcuni tratti.


2
2018-05-12 02:07