Y a-t-il quelque chose comme celui-ci dans la norme C ++ / stl ? Idéalement, il devrait être construit comme J'ai besoin de construire parfois ou d'avoir une chaîne de taille fixe. Parfois, être capable de lire / écrire seulement que de nombreux personnages dans un flux. P> Edit: EM> P> Notez que la taille n'est connue qu'au runtime et est différent de l'un à l'autre. Mais tout le Fstring code> S doit savoir comment travailler ensemble et avoir tout le comportement de la chaîne code> fantaisie code>. P> p>
11 Réponses :
Array de caractères de style C?
Cela manque toutes les fonctions membres d'un conteneur STL - même le sous-ensemble pouvant s'appliquer à un conteneur à longueur fixe.
Pourquoi ne pas utiliser std :: basic_string de stl en tant que classe de chaîne fixe?
Vous pouvez utiliser le constructeur p> comme initialisation. p> plus tard éditer: strong>
Exemple: p>
Le problème est que la chaîne créée ne fait pas de rognage / rembourrage, ni de sa limite de caractères.
Pour cela, vous devez définir votre propre classe, si vous souhaitez une solution encapsulée ou utiliser ce qui existe sur le marché. Voir Algorithmes de string Boost pour la rognage: boost.org/doc/libs /1_40_0/doc/html/string_algo.html
Si je vous comprends correctement, vous ne voulez pas utiliser Utilisez une chaîne de style C brut et les fonctions de Utilisez un std :: String Code> Parce que vous êtes inquiet, il pourrait vous étendre silencieusement sur vous. Je vois quelques options: p>
cstdio code> qui prennent un argument de longueur (par exemple, fgets code>). p> li >
std :: vecteur
Mais std :: vecteur
Seulement si vous le demandez. opérateur >> code> sur une chaîne développera automatiquement la chaîne pour accueillir tout ce que vous lisez. Avec un vecteur, vous devez insérer explicitement ou appuyer sur votre limite imposée.
Ah, vous faites référence à opérateur >> code>. Ce n'était pas clair de votre publication.
@SBI Question suivante: Comment allez-vous réellement opérateur >> code> dans ce vecteur
Il y a probablement quelque chose dans Boost qui l'offre (le plus proche que j'ai personnellement vu est Boost.Array, qui est insuffisant). Toutefois, si vous cherchez simplement à modéliser le "sous-ensemble important" de Pour quiconque demande pourquoi la peine de le faire du tout, le principal avantage est d'éviter une allocation de mémoire sans perdre la plupart des std :: string code>, il n'est pas très difficile de faire un équivalent de longueur fixe: STD :: String Code> API. S'il y a une autre façon de faire cela avec std :: allocator code>, je serais curieux de savoir. P> p>
J'ai essayé, mais je ne vois pas comment cela peut fonctionner. Le problème est que la chaîne peut (volonté) demander plus de mémoire à partir de l'allocator qu'il en a besoin actuellement. E.G, lorsque j'ai défini la limite de mon allocator sur 32 caractères, je n'ai réussi que 16 caractères sur 25.
L'approximation la plus proche d'aujourd'hui est Boost :: Array
Utilisez par ex.
Maintenant que C ++ 11 a été là depuis un moment, on peut utiliser STD :: Array à en.cpprefreence.com/w/cpp/Container/array .
Comment sur l'héritage std :: string code> en privé puis exposant une interface plus petite avec en utilisant code> et écrire vos propres fonctions << / p>
J'utilise quelque chose comme celui-ci pour les chaînes allouées sur la pile ou dans le cadre d'un autre objet. Qui en libération devient un char *
avec C ++ 11, on peut aller pour
std::string s2(std::begin(s), std::end(s));
avec ISO C ++ +17, vous pouvez faire ce
J'avais besoin de quelque chose comme ça aussi. J'ai construit une solution basée sur Istream_iterator avec une contrainte supplémentaire sur block_Size.
Vous pouvez trouver mon référentiel Block_iterator sur github < / a> p> Il est seulement un seul tête de tête Ici p> Ceci fonctionne comme Istream_iterator afin de diviser une chaîne en 3 chaînes de caractères comme suit: p>
Je suis un peu rouillé mais comment ça différer d'un caractère []?
@Lazarus - une classe de cordes fixe STD :: String-Esque pourrait offrir beaucoup plus de fonctionnalités, notamment le remplacement << / >>, que le type de blanc []. C'est aussi Afaik pas possible d'avoir STD :: Vector, mais serait possible d'avoir STD :: vecteur >.
Quel comportement de chaîne "fantaisie" voulez-vous utiliser? Cela nous aiderait à fournir une meilleure réponse si nous connaissions le sous-ensemble des fonctions membres de la chaîne que vous utilisiez.
Les trucs fantaisistes incluent l'entrée et la sortie des flux (y compris le remplissage et la lecture uniquement des caractères requis), des sous-domestiques de chaîne, des itérateurs etc. On dirai que je devrai écrire le mien.
Je pense que vous pouvez simplement envelopper une chaîne, si vous pouvez vivre avec lui que la chaîne peut allouer plus de mémoire que votre Fstring permet d'utiliser.
Je travaille sur une classe standard STD :: fixe_string classe. Voir N4121 et Github.com/tomazos/fixed_string .
A partir de boost 1.66: Boost .ORG / DOC / LIBS / 1_66_0 / LIBS / BEASH / DOC / HTML / BEAST / REF / ... Notez que la capacité est fixée à la compilation, donc pas tout à fait ce que l'OP recherchait.