Il me semble que beaucoup de bibliothèques C ++ plus grandes finissent par créer leur propre type de chaîne. Dans le code client que vous avez soit d'utiliser celui de la bibliothèque ( QString
, CString
, fbstring
etc., je suis sûr que tout le monde peut en nommer que quelques - uns) ou garder la conversion entre le type standard et celui des usages bibliothèque (qui la plupart du temps implique au moins une copie).
Alors, y a-t-il un problème particulier ou une anomalie std::string
(tout comme la auto_ptr
sémantique était mauvaise)? At-il changé en C ++ 11?
java.lang.String
(manque de surcharge d'opérateur, etc.) rendrait difficile l'utilisation de tout autre chose.Réponses:
La plupart de ces plus grandes bibliothèques C ++ ont été démarrées avant d'
std::string
être normalisées. D'autres incluent des fonctionnalités supplémentaires qui ont été normalisées tardivement, ou ne sont toujours pas normalisées, telles que la prise en charge de UTF-8 et la conversion entre les codages.Si ces bibliothèques étaient mises en œuvre aujourd'hui, elles choisiraient probablement d'écrire des fonctions et des itérateurs fonctionnant sur des
std::string
instances.la source
char
est garanti d'être assez grand pour contenir n'importe quel point de code UTF-8. Autant que je sache, c'est le seul "support" fourni par C ++ 98.wchar_t
sont pas assez grands pour représenter tous les points de code Unicode. De plus, il y a eu toute cette discussion sur UTF-16 considérée comme préjudiciable lorsque l'argument très convaincant a été avancé selon lequel l' UTF-8 devrait être utilisé exclusivement …String est le gros embarras de C ++.
Pendant les 15 premières années, vous ne fournissez pas de classe de chaîne, ce qui oblige chaque compilateur de chaque plate-forme et chaque utilisateur à créer le leur.
Ensuite, vous créez quelque chose de confus quant à savoir si elle est supposée être une API de manipulation de chaîne complète ou juste un conteneur de caractères STL, avec certains algorithmes qui dupliquent ceux qui sont sur un std :: Vector ou qui sont différents.
Où une opération de chaîne évidente telle que replace () ou mid () implique un tel amalgame d'itérateurs qu'il est nécessaire d'introduire un nouveau mot clé "auto" pour que l'instruction soit correcte sur une seule page et conduit la plupart des gens à abandonner la totalité du langage .
Et puis vous avez unicode 'support' et std :: wstring qui est juste arghh .....
<rant off> merci - je me sens beaucoup mieux maintenant.
la source
std::string
. L'absence d'une classe de cordes en 1983 ne justifie pas d'en avoir plus maintenant.En fait ... il y a plusieurs problèmes avec
std::string
, et oui, la situation s'améliore un peu en C ++ 11, mais il ne faut pas prendre de vitesse.QString
etCString
font partie d’ anciennes bibliothèques, elles existaient donc avant la normalisation du C ++ (un peu comme le SGL STL). Ils ont donc dû créer une classe.fbstring
répondre à des problèmes de performance très spécifiques. La norme prescrit une interface et une complexité algorithmique garantissant des minima. Il s'agit toutefois d'un détail de qualité d'implémentation, que cela soit rapide ou non.fbstring
a des optimisations spécifiques (liées au stockage, ou plus rapidefind
par exemple).Autres préoccupations qui n'ont pas été évoquées ici (en vrac):
std::string
codage ignorant et n'ayant pas de code spécial pour UTF-8, il est facile de stocker une chaîne UTF-8 et de la corrompre par inadvertancestd::string
l’interface est surchargée , de nombreuses méthodes auraient pu être implémentées en tant que fonctions libres et beaucoup sont dupliquées pour se conformer à la fois à une interface basée sur un index et à une interface basée sur un itérateur.la source
c_str()
renvoi d'un pointeur sur la mémoire contiguë, ce qui permet une certaine interopérabilité du C. Cependant, vous ne pouvez pas modifier les données pointées. Les solutions de contournement typiques incluent l’utilisation devector<char>
.&s[0]
cela n'a plus d'importance :)&s[0]
ne peut pas pointer vers une chaîne terminée par NUL (à moins d'c_str()
avoir été appelé depuis la dernière modification).c_str()
Retour: Un pointeurp
tel quep + i == &operator[](i)
pour chaquei
entrée[0,size()]
".Outre les raisons affichées ici, il en existe un autre - la compatibilité binaire . Les rédacteurs des bibliothèques n’ont aucun contrôle sur l’
std::string
implémentation que vous utilisez ni sur le fait qu’elle possède la même structure de mémoire que la leur.std::string
est un modèle, sa mise en œuvre provient donc de vos en-têtes STL locaux. Maintenant, imaginez que vous utilisiez localement une version STL optimisée pour les performances, entièrement compatible avec le standard. Par exemple, vous avez peut-être choisi d’introduire des tampons statiques dans chacunstd::string
d’ eux pour réduire le nombre d’allocations dynamiques et d’absence de mémoire cache. En conséquence, la disposition de la mémoire et / ou la taille de votre implémentation sont différentes de celles de la bibliothèque.Si seule la présentation est différente, certains
std::string
appels de fonction de membre sur des instances passées de la bibliothèque au client ou l'inverse peut échouer, en fonction des membres déplacés.Si la taille est également différente, tous les types de bibliothèque ayant un
std::string
membre auront une taille différente quand ils sont cochés dans la bibliothèque et dans le code client. Lesstd::string
décalages des membres de données suivants seront également décalés, et tout accesseur en accès direct / en ligne appelé à partir du client retournera des ordures, malgré le "bon résultat" lors du débogage de la bibliothèque elle-même.Bottomline - Si la bibliothèque et le code client sont compilés par des
std::string
versions différentes , ils seront parfaitement liés , mais cela peut donner lieu à des bogues méchants et difficiles à comprendre. Si vous modifiez votrestd::string
implémentation, toutes les bibliothèques exposant des membres de STL doivent être recompilées pour correspondre à lastd::string
présentation du client . Et parce que les programmeurs veulent que leurs bibliothèques soient robustes, vous ne les verrez que rarementstd::string
exposés.Pour être juste, cela s'applique à tous les types de LIST. IIRC ils n'ont pas la disposition de mémoire standardisée.
la source
Il y a beaucoup de réponses à la question mais en voici quelques unes:
Héritage. De nombreuses bibliothèques et classes de chaînes ont été écrites AVANT l’existence de std :: string.
Pour la compatibilité avec le code en C. La bibliothèque std :: string est en C ++, car il existe d’autres bibliothèques de chaînes qui fonctionnent avec C et C ++.
Pour éviter les allocations dynamiques. La bibliothèque std :: string utilise l'allocation dynamique et peut ne pas convenir aux systèmes intégrés, au code d'interruption ou en temps réel ou aux fonctionnalités de bas niveau.
Modèles. La bibliothèque std :: string est basée sur des modèles. Jusqu'à récemment, un certain nombre de compilateurs C ++ avaient un support de gabarit peu performant ou même bogué. Malheureusement, je travaille dans un secteur qui utilise de nombreux outils personnalisés et l'une de nos chaînes d'outils d'un acteur majeur du secteur ne supporte pas "officiellement" le C ++ (avec des bugs comme modèles, etc.).
Il y a probablement beaucoup d'autres raisons valables aussi.
la source
Cela concerne principalement Unicode. La prise en charge standard pour Unicode est au mieux catastrophique et chacun a ses propres besoins en Unicode. Par exemple, ICU prend en charge toutes les fonctionnalités Unicode que vous pourriez souhaiter, derrière l’interface Java la plus dégoûtante que vous puissiez imaginer, et si vous êtes sur Unix coincé avec UTF-16, votre idée de un bon moment.
En outre, de nombreuses personnes ont besoin de différents niveaux de prise en charge Unicode. Tout le monde n'a pas besoin des API de mise en page de texte complexes, etc. Il est donc facile de comprendre pourquoi de nombreuses classes de chaînes existent. La classe Standard est vraiment nul et tout le monde a des besoins différents des nôtres, personne ne parvenant à créer une seule classe pouvant exécuter de nombreuses fonctions de support Unicode sur plusieurs plates-formes avec une interface agréable.
A mon avis, c'est principalement la faute du Comité C ++ pour ne pas fournir correctement le support pour Unicode - en 1998 ou 2003, c'était peut - être compréhensible, mais pas en C ++ 11. Espérons qu'en C ++ 17, ils feront mieux.
la source
C'est parce que chaque programmeur a quelque chose à prouver et qu'il ressent le besoin de créer sa propre classe de cordes impressionnante et plus rapide pour sa fonction géniale. C'est généralement un peu superflu et conduit à toutes sortes de conversions de chaînes supplémentaires dans mon expérience.
la source