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 ?
Réponses
Trop de publicités?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.
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.
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 :
- Chargement d'un pointeur à partir d'une chaîne de caractères
- Ajouter un index
- 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.
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.