6
votes

Pourquoi les types de chaîne et de vecteur sont-ils distincts?

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?


0 commentaires

4 Réponses :


1
votes

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 est trop ballonné et incompatible avec le reste de la STL, mais il est trop tard pour le changer.


1 commentaires

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).



3
votes

Strings ont des fonctions String String String: C_STR , SUBSTR , Concaténation, entre autres. Aussi, n'oubliez pas le point important que chaînes ajoutez automatiquement le '\ 0' à 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 ou quelque chose comme ça.

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.


2 commentaires

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 pour prendre en charge toutes ces opérations pour t * , car char * se trouve être un pointeur avec un pointeur avec une Signification spécifique.



6
votes

std :: ficelle a beaucoup d'opérateurs que STD :: vecteur ne fait pas:

  • Opérateur + (Ajoutez la chaîne A à String B, + n'a pas vraiment de sens pour les vecteurs)
  • Opérateur <,>, == ,! = (comparaison de chaîne, certains n'ont pas de sens pour les vecteurs)
  • c_str () (renvoyer une représentation "style C")
  • et plus (y compris la sous-chaîne, trouver, etc., mais certaines d'entre elles sont implémentées ailleurs dans la STL et peuvent être utilisées sur des vecteurs, une sorte de)

    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.


0 commentaires

11
votes

La plupart des risques concernent la localisation et l'internationalisation (L10I18), des performances et des raisons historiques.

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.

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.

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.

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.

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.


0 commentaires