Ce sont des matrices à la fois redimensionnables, et STD :: basic_string n'a pas de fonctions spécifiquement liées à un caractère comme Upper (). Qu'est-ce qui est spécial à propos de la chaîne pour améliorer les données de caractères? P>
4 Réponses :
C'était une décision de conception au début de la création STL. Je pense que beaucoup de gens admettent maintenant que std :: string code> est trop ballonné et incompatible avec le reste de la STL, mais il est trop tard pour le changer. P>
Oui, c'est une bonne de connaissance commune. L'un des livres Sutter / Alexandrescu C ++ a même un chapitre à ce sujet (avec un exercice de la refonte de la classe STD :: String).
Strings ont des fonctions String String String: Mais oui, ils sont incroyablement similaires. Ils tiennent tous les deux un pointeur sur un tableau alloué en tas, mais ils ne sont certainement pas les mêmes. P> C_STR CODE>,
SUBSTR CODE>, Concaténation, entre autres. Aussi, n'oubliez pas le point important que
chaînes code> ajoutez automatiquement le
'\ 0' code> à la fin de leurs données (et la gère correctement avec la concaténation, etc.) afin qu'ils Vous n'avez pas la même opération qu'un
vecteur
Je ne vois pas vraiment substraire ou concaténation comme spécifique de caractères. Il existe des langues qui fournissent à celles des tableaux arbitraires. Vous avez raison sur la null-résiliation, cependant: C_STR () est, malheureusement, la fonction la plus courante que j'utilise sur STD :: String.
@ DAN04: STD :: String a des tonnes de fonctions et de surcharges conçues pour le faire fonctionner de manière main à la main avec des chaînes de style C (qui se trouve être des littéraux de chaînes en C ++). Il ne serait pas de sens pour vecteur
t * code>, car
char * code> se trouve être un pointeur avec un pointeur avec une Signification spécifique.
std :: ficelle a beaucoup d'opérateurs que STD :: vecteur ne fait pas: p>
Certes, il y a peu d'autre que STD :: String a qu'un vecteur ne peut pas ou ne pouvait pas, mais ceux-ci sont importants, ils sont la majorité des cas d'utilisation pour une chaîne. P>
La plupart des risques concernent la localisation et l'internationalisation (L10I18), des performances et des raisons historiques. p>
Pour les problèmes L10I18, CHAR_TRAITITS a été ajouté et vous noterez que les flux sont également. L'intention était de faire de "personnages plus intelligents" d'une manière, mais le résultat était inutile. À propos de la seule chose que Char_Traits est bon pour se spécialiser une partie de la STD: String / Wstring se compare, des copies, etc. en tant que compilateur intrinsèque. p>
L'échec est principalement dû aux flux UNIX eux-mêmes, qui voient le caractère comme principal "atome" principal où dans Guis, Web, etc. qui sont internationalisés la chaîne est le principal "atome". En d'autres termes, dans la terre C / C ++, nous avons des "baies muettes de caractères intelligents" pour les chaînes, tandis que toutes les autres langues utilisent des "tableaux intelligents de caractères muettes". Unicode prend cette dernière approche. p>
Une autre grande différence entre base de base_string et vecteur - basic_string ne peut contenir que des types de pod. Cela peut faire la différence dans certains cas SOMOETIME Le compilateur a un temps plus facile optimisant basic_string par rapport au vecteur. P>
basic_string a parfois beaucoup d'autres optimisation, telles que la copie sur l'optimisation de l'écriture et de la petite chaîne. Celles-ci varient d'une implémentation à l'autre. P>
Cependant, probablement la raison pour laquelle il y a deux choses presque la même chose est historique: les chaînes antérieures à la STL, et la plupart des travaux semblaient centrifugés pour les rendre interopérir avec la bibliothèque iostream. Un mythe urbain C ++ est que STL est une "bibliothèque de conteneurs" qui a été ajoutée à C ++. Ce n'est pas le cas, et de l'adopter en C ++, des conteneurs ont été ajoutés. Une "interface STL" a également été boulonnée sur la classe de cordes existante. std :: Vector a été largement pris d'une implémentation vectorielle qui existait dans l'Adastl. p>