Compte tenu d'une chaîne, je dois retourner le caractère ou les caractères du milieu (si la chaîne est même) de la chaîne. C'est ce que j'ai proposé.
#include <iostream>
#include <string>
int main ()
{
std::string str ("This is an example sentence.");
std::cout << str << '\n';
// "This is an example sentence."
str.erase (10,8); // ^^^^^^^^
std::cout << str << '\n';
// "This is an sentence."
str.erase (str.begin()+9); // ^
std::cout << str << '\n';
// "This is a sentence."
str.erase (str.begin()+5, str.end()-9); // ^^^^^
std::cout << str << '\n';
// "This sentence."
return 0;
}
4 Réponses :
Le deuxième paramètre doit être un itérateur ici et tout le Codes Alike:
input.erase(input.begin() + 1,(input.size() - 1) / 2);
Oh, donc la fonction effaçante peut prendre différentes formes? L'une de ces formes est si je saisis un itérateur pour mon premier paramètre, je dois également saisir un itérateur pour mon deuxième paramètre?
@JXKCD Il a des surcharges. Vérifiez simplement le lien que j'ai cité s'il vous plaît. C'était la différence entre votre code et celui que vous avez cité
J'ai. Je n'ai pas réalisé que cela avait des surcharges, je fais maintenant, merci.
Vous pouvez soit utiliser des itérateurs (INPUT.BEGIN () et INPUT.END () sont des itérateurs) ou INT pour spécifier la partie effaçante. Vous ne pouvez pas utiliser les deux en même temps. P>
Ceci est faux. Si vous voulez en savoir plus sur les itérateurs, ce qui est un concept intéressant, vous pouvez vérifier:
Qu'est-ce qu'un itérateur en général? P> entrée.erase (entrée.begin (), (entrée.Size () / 2) - 1); code> p> P>
entrée.erase (0, (entrée.Size () / 2) -1); code> devrait fonctionner à la place. P>
Il ne fait toutefois pas que l'entrée.begine () n'est pas toujours équivalente à 0 et ma sortie sera fausse.
@JXKCD INPUT.BEGIN () CODE> est TOUJOURS B> égal à 0 code>. commence code> pointe sur le premier élément qui est ce que l'index 0 représente également.
Peut-être que je me trompe, mais pour la ficelle, je pense que c'est toujours la même chose. (Si quelqu'un lisant cela sait, s'il vous plaît dites-moi) de toute façon, vous pouvez modifier l'appel de votre code> Erase CODE>, en lui donnant un itérateur sur le dernier élément que vous souhaitez supprimer. Quelque chose comme: entrée.erase (entrée.begin (), entrée.begin + ((entrée.Size () / 2) - 1)); code>
Lorsque j'utilise la fonction code> effacer code>, il déplace toujours la chaîne à gauche est ce que vous dites?
@Alois Christen Oh, j'ai trouvé une solution de travail, j'ai utilisé la surcharge de séquence pour la première étape, puis la surcharge de la plage pour la deuxième étape.
Vos problèmes directs de côté, vous n'avez rien à effacer à partir d'un Si vous souhaitez renvoyer le caractère médian (ou deux lorsque le nombre de caractères est même), alors faites cela: P> std :: string code> pour obtenir vos taks. std::string get_middle(std::string input) {
auto middle = input.size() /2;
if (input.size() % 2 == 1) {
return { input[middle] };
} else {
return std::string{ input[middle-1] } + input[middle];
}
}
J'ai essayé d'utiliser cette méthode mais j'ai eu quelques problèmes de type alors je suis tout simplement allé avec ma méthode actuelle.
@Jxkcd fwiw, cela n'a pas de problème de problèmes, voir ici: wandbox.org/permlink/a1sbz8ie4fyimbqq .
Oh, je n'ai pas supposé que votre code a des erreurs, mais plutôt la mienne à l'aide de la même méthode de chaîne combinée.
Il semble y avoir une erreur dans votre code, elle produite st code> au lieu de es code>.
@JXKCD Oui, corrigé maintenant
Pour les démarreurs, il n'est pas nécessaire d'appliquer la fonction de membre effacée que pour obtenir un tring composé de caractères moyens de la chaîne source.
La fonction par exemple peut ressembler à p>
input.erase(input.begin(), (input.size() / 2) - 1);
Quelle est l'erreur?
Aucun élément de membre correspondant pour appeler à 'effacer'
Consultez le Référece . Il n'y a pas de surcharge qui prend un itérateur et une taille. Si vous utilisez des itérateurs, vous avez besoin d'une gamme Itératrice.
L'exemple a 3 appels à effacer. Lequel correspond à ceux de votre programme?
@JXKCD Veuillez Copier-coller B> l'erreur, dans votre question, au lieu de la paraphraser.
Pourquoi effacer quoi que ce soit? Cela n'a aucun sens. Utilisez un seul
std :: string :: substraire code> appel.Merci de me parler de cette fonction, cependant, ne pensez-vous pas que je l'utiliserais à la place si je le savais? J'utilisais simplement mes connaissances disponibles pour résoudre la question.
Mais votre façon de résoudre, c'est défectueux et on devrait vous dire ça. Imaginez que vous ayez un vecteur contenant 1000 entrées. Vous n'avez rien à effacer de cela pour accéder à l'élément à la position 500, ce serait plutôt inutile
Je peux voir que et je l'ai remercié de me dire sur la fonction
substr code>. J'étais juste ennuyé de son façon arrogante de m'informer.Je ne vois pas où il y a de l'arrogance, mais ce n'est jamais ...