2 votes

Le remplacement d'un caractère dans une chaîne de caractères coûte ?

La classe string de stl est-elle mutable ? Combien coûte le remplacement d'un caractère dans une chaîne de caractères par un entier transformé en caractère ?

3voto

olooney Points 1245

1) Oui, il est mutable. operator[] et at() renvoient tous deux des références non-const à des caractères et peuvent être utilisés du côté gauche : name[7] = 'X' ou name.at(7) = 'X' si vous souhaitez un contrôle des limites.

2) Le coût de modification d'un seul caractère est très faible : il est très proche ou identique à celui d'une chaîne de caractères en C (plus le coût de la vérification des limites à l'aide de la fonction at() .) Bien que la norme ne l'exige pas, toutes les implémentations de std::string stockent la chaîne dans un bloc de mémoire contigu (si je me souviens bien de Meyers), de sorte que le changement d'un caractère sur place se fera en un temps constant.

Voir aussi le algorithmes de stimulation des chaînes de caractères qui fournissent généralement des versions copiées et in situ des manipulations de chaînes de caractères les plus courantes.

1voto

Sander De Dycker Points 6074

Oui, vous pouvez modifier le contenu d'un std::string .

Par exemple, en utilisant std::string::operator[] :

std::string str("foo");
str[0] = 'b';
std::cout << str << std::endl;

produira "boo" .

Le coût du remplacement d'un seul caractère est égal au coût de la copie d'un caractère dans cet emplacement mémoire sur votre plate-forme. Probablement pas beaucoup.

1voto

Steve Jessop Points 166970

Oui, il est mutable.

Si vous voulez dire quelque chose comme.. :

std::string s("space\n");
int i = 'i';
s[2] = (char)i;
std::cout << s; // prints 'spice'

Les détails sont définis par la mise en œuvre, mais la troisième ligne se compose généralement de ce qui suit :

  1. Chargement d'un pointeur à partir d'une chaîne de caractères
  2. Ajouter un index
  3. Effectuer un stockage d'octets à cette adresse

C'est donc bon marché. Il peut y avoir des vérifications de limites et ainsi de suite en mode débogage, et il peut y avoir d'autres codes là-dedans, mais ce qui précède est fondamentalement ce qu'il doit faire.

0voto

Mark B Points 60200

Sí.

Linéaire pour trouver un personnage (mais constant si vous connaissez déjà l'index). Le remplacement réel est un temps constant si l'on prend en compte le sens littéral de votre question. Le remplacement serait linéaire en fonction du nombre de caractères après le point de remplacement si vous voulez parler d'une représentation sous forme de chaîne de caractères de l'entier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X