11
votes

Classe de cordes de longueur fixe C ++?

Y a-t-il quelque chose comme celui-ci dans la norme C ++ / stl ? Idéalement, il devrait être construit comme xxx

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.

Edit:

Notez que la taille n'est connue qu'au runtime et est différent de l'un à l'autre. Mais tout le Fstring S doit savoir comment travailler ensemble et avoir tout le comportement de la chaîne fantaisie .


7 commentaires

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.


11 Réponses :


0
votes

Array de caractères de style C? XXX


1 commentaires

Cela manque toutes les fonctions membres d'un conteneur STL - même le sous-ensemble pouvant s'appliquer à un conteneur à longueur fixe.



1
votes

Pourquoi ne pas utiliser std :: basic_string de stl en tant que classe de chaîne fixe?

Vous pouvez utiliser le constructeur xxx

comme initialisation.

plus tard éditer: Exemple: xxx


2 commentaires

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



0
votes

Si je vous comprends correctement, vous ne voulez pas utiliser std :: String Parce que vous êtes inquiet, il pourrait vous étendre silencieusement sur vous. Je vois quelques options:

  1. Utilisez une chaîne de style C brut et les fonctions de cstdio qui prennent un argument de longueur (par exemple, fgets ).

  2. Utilisez un std :: vecteur .


4 commentaires

Mais std :: vecteur sera en silence, aussi! Prenez Stackoverflow.com/Questtions/1571901/1571978#1571978


Seulement si vous le demandez. opérateur >> 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 >> . Ce n'était pas clair de votre publication.


@SBI Question suivante: Comment allez-vous réellement opérateur >> dans ce vecteur ...: |



1
votes

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 std :: string , il n'est pas très difficile de faire un équivalent de longueur fixe: xxx

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 API. S'il y a une autre façon de faire cela avec std :: allocator , je serais curieux de savoir.


1 commentaires

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.



11
votes

L'approximation la plus proche d'aujourd'hui est Boost :: Array


0 commentaires

5
votes

Utilisez par ex. xxx


1 commentaires

Maintenant que C ++ 11 a été là depuis un moment, on peut utiliser STD :: Array à en.cpprefreence.com/w/cpp/Container/array .



2
votes

Comment sur l'héritage std :: string en privé puis exposant une interface plus petite avec en utilisant et écrire vos propres fonctions << / p>


0 commentaires

2
votes

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 * xxx


0 commentaires

1
votes

avec C ++ 11, on peut aller pour

std::string s2(std::begin(s), std::end(s));


0 commentaires

1
votes

avec ISO C ++ +17, vous pouvez faire ce xxx


0 commentaires

1
votes

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>

Il est seulement un seul tête de tête Ici

Ceci fonctionne comme Istream_iterator afin de diviser une chaîne en 3 chaînes de caractères comme suit: xxx


0 commentaires