Am în mod regulat dezbateri cu colegii cu privire la utilizarea std :: string peste tot. sau încă mai trebuie să realizeze liniile lor de clasă.
Una dintre problemele - este o chestiune de calitate a punerii în aplicare a std :: string. Este amuzant că majoritatea oamenilor am cerut să schițeze un prototip al clasei de linii, mai mult sau mai puțin eficiente din punctul de vedere al memoriei, a scris despre următoarele:
Este clar că cu o astfel de realizare a unei linii de instrucțiuni de atribuire în materie de memorie va crește numai. Acest lucru este intenționată.
Practic, nimeni nu a crezut o dată despre necesitatea unei operațiuni de swap în mișcare de exemplu. Într-un fel, prezența unui operator de constructorul de copiere și atribuire este considerată suficientă.
Că pentru a răspunde la această întrebare o dată și pentru mine, am scris un program de testare. Acest program sortează o serie de șiruri lungi. Siruri de caractere sunt reprezentate în patru moduri: obiectul std :: string. un pointer la un std :: string. Clasa String obiect autodidact (A se vedea mai sus.) Și un pointer la un șir.
Conform estimărilor preliminare de lucru evidentă prin indicele ar trebui să fie la fel de eficace ca și în acest caz, atunci când se deplasează obiecte sunt std fizic :: sort () transpune singurele semne, nu de ei înșiși obiecte.
Dar atunci când se lucrează direct cu obiectele va fi interesant pentru a compara banală linie de realizare va produce std :: string.
Se poate observa că versiunea cu indicii au lucrat aproximativ la fel de rapid, dar atunci când se lucrează cu obiecte std :: string a depășit punerea în aplicare a auto-a făcut de 4 ori - 203 ms vs 891 ms.
Este ușor de înțeles de ce este așa. std :: sort () pentru a rearanja elementele folosind un std funcție șablon :: swap (). care, pentru std :: string este pus în aplicare, astfel încât să se facă o permutare fără a copia fizic datele. Iar pentru Șir totul este un loc comun pe constructorul copy si operatorul de atribuire.
În general, pentru mine, am trecut, nu este nevoie să gard gradina ta, pentru că în cele mai multe cazuri, std :: string rezolvă toate problemele. Dar se pune întrebarea - cum să adăugați std :: string funcționalitatea? De exemplu, o căutare de cuvinte.
Problema este că destructor std :: string este declarat ca non-virtuale (poate acest lucru se face din motive de eficiență), și moștenirea unei clase cu destructor non-virtuale în C ++ nu este ideea cea mai corectă.
In timp ce am putea face o functie membru pentru a reveni lungime, este mai bine să-l o functie prieten la nivel mondial face. Dacă vom face acest lucru, vom fi în măsură să definească aceeași funcție pentru a lucra la matrice încorporate și pentru a atinge o mai mare uniformitate a designului în cele din urmă. Am făcut dimensiuni într-o funcție de membru în STL într-o încercare de a vă rugăm comisiei standard de. Am știut că încep, end și dimensiunea trebuie să fie funcții la nivel mondial, dar nu a fost dispus să riște o altă luptă cu comisia.
El crede că lungimea funcției șablonul global () - este mai corect decât lungimea () ca membru al clasei. Dacă nu pentru comisia de standardizare - așa că ar fi în STL.
Deci, pentru a rezuma cele de mai sus, nu este necesar să aibă încredere std :: string. Pentru cele mai multe scopuri, această clasă rezolvă toate problemele. Dacă aveți nevoie să adăugați funcționalitate - trebuie să se facă prin punerea în aplicare a unui algoritm generic.
Ai un comentariu sau protesteze? Se aplică.