0
votes

Utilisation du reverse (string.begin (), string.end ()) de C ++) Pourquoi ne me laisse-t-il pas le conserver dans une nouvelle variable?

Bonjour, je suis très nouveau dans la programmation et le C ++. J'essaye de faire un programme qui vérifie si une chaîne est un palindrome (un mot qui est le même en arrière qu'en avant).

Pour ce faire, j'ai cherché en ligne comment inverser une chaîne et suis tombé sur la fonction inverse (string.begin (), string.end ()) de <bits / stdc ++. H>.

J'ai créé une fonction qui peut inverser la chaîne écrite dans les paramètres et cela fonctionne bien:

C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/basic_string.h:776:7: note:   no known conversion for argument 1 from 'void' to 'std::initializer_list<char>'
The terminal process "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command g++ -g main.cpp" terminated with exit code: 1.

Mais quand je veux assigner la chaîne inversée dans une nouvelle variable "reverseStr":

#include <iostream>
#include <vector>
#include <string>
#include <bits/stdc++.h>

std::string reverseStr(std::string str) {
    std::string reversedStr;
    reversedStr = reverse(str.begin(), str.end());
    
    return reversedStr;
} 

int main() {

    std::cout << reverseStr("word");

}

Ensuite, quand j'essaye de le compiler, cela me donne cette erreur.

#include <iostream>
#include <vector>
#include <string>
#include <bits/stdc++.h>

std::string reverseStr(std::string str) {
    reverse(str.begin(), str.end());
    
    return str;
} 

int main() {

    std::cout << reverseStr("word");

}

Si cela ne vous dérange pas d'expliquer ce qui se passe, ce serait génial! Merci!


1 commentaires

Note latérale: Pourquoi ne devrais-je pas #include <bits / stdc ++. H>? Au lieu de cela, vous devez #include <algorithm>


3 Réponses :


4
votes

reverse inverse une collection en place et ne la retourne pas. Si vous voulez le faire avec une nouvelle variable, copiez d'abord la chaîne dans la variable puis inversez cela:

// pass the str argument by reference to avoid unnecessary copies
std::string reverseStr(const std::string& str) {
    std::string reversedStr = str;
    std::reverse(reversedStr.begin(), reversedStr.end());
    return reversedStr;
} 


4 commentaires

Mieux encore, utilisez std::reverse_copy avec un std::back_inserter . Peut-être plus avancé que nécessaire, mais je voulais être intelligent :( en.cppreference.com/w/cpp/algorithm/reverse_copy


@JohnFilleau ça n'a pas besoin d'être si compliqué, une ligne std::string reverseStr( str.rbegin(), str.rend() ); ou qui devrait être une déclaration de retour dans ce cas


"passer l'argument str par référence pour éviter les copies inutiles" commentaire très amusant quand la première chose que vous faites est de faire une copie


C'est plus que drôle, c'est vraiment mauvais. Passer par const& rompt l'optimisation des déplacements.



0
votes

std::reverse() est utilisé pour inverser les éléments dans la plage donnée par les deux paramètres, str.begin() et str.end() dans votre cas. Cela ne renvoie pas une nouvelle chaîne inversée, mais inverse la collection elle-même.

Si vous souhaitez que le contenu inversé dans une nouvelle variable, vous devez d'abord copier la chaîne d'origine dans une nouvelle chaîne, puis inverser la nouvelle chaîne. Vous pouvez également utiliser std::reverse_copy() qui copie le contenu inverse dans une nouvelle chaîne sans affecter l'original. Il prend un troisième paramètre qui indique où le contenu inversé doit être copié. Notez que la variable de chaîne inversée doit d'abord être redimensionnée à la taille de la chaîne d'origine.

std::string reverseStr(std::string& str) {
    std::string reversedStr;
    reversedStr.resize(str.size());

    std::reverse_copy(str.begin(), str.end(), reversedStr.begin());
    return reversedStr;
}

Quelques informations supplémentaires: std::reverse() et std::reverse_copy() sont présentes dans le fichier d'en-tête <algorithm> . <bits/stdc++.h> n'est pas standard et spécifique au compilateur et doit donc être évité. Vérifiez cette réponse pour plus de détails: Pourquoi ne devrais-je pas #include <bits / stdc ++. H>?


0 commentaires

1
votes

Comme indiqué dans la documentation, std::reverse() ne renvoie rien, vous ne pouvez donc pas affecter sa valeur de retour à une variable. La solution la plus simple serait:

std::string reverseStr(const std::string &str) 
{
    return std::string( str.rbegin(), str.rend() );
} 

utiliser des itérateurs inverses pour initialiser et renvoyer temporaire std::string


0 commentaires