IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

iterateur de string (cours c++ moderne)


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Par défaut iterateur de string (cours c++ moderne)
    bonjour à tous, j'ai un souci pour créer des iterateurs de debut et fin de string, dans le tuto c++ moderne tous les iterateurs sont crées avec auto (et ça fonctionne) mais lorsque j'essaye de créer un iterateur de string avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string phrase {"un exemple"};
    std::string::iterator it_debut{std::begin(phrase)};
    le compilateur me dit:

    aucune instance du constructeur "std::_String_iterator<_Mystr>::_String_iterator [avec _Mystr=std::_String_val<std::conditional_t<true, std::_Simple_types<char>, std::_String_iter_types<char, size_t, ptrdiff_t, char *, const char *, char &, const char &>>>]" ne correspond à la liste d'arguments projet algorithmes C:\Users\aperikub\source\repos\projet algorithmes\projet algorithmes\main.cpp

    et si j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string::iterator it_debut{phrase.begin};
    je ne peux pas me servir de l'iterateur, et j'ai cette erreur:

    aucune instance de fonction surchargée "ma fonction (search, count etc..)" ne correspond a la liste d'arguments.

    du coup utiliser auto pour gagner du temps c'est bien mais ça m'emm*rde de l'utiliser parce que je ne sais pas comment faire autrement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 759
    Par défaut
    Il faut lire la documentation
    std::begin et std::string::begin, 2 liens cplusplus.com en anglais.

    Et d'après ce que je comprends c'est que la syntaxe que tu veux utiliser template <class T, size_t N> T* begin (T(&arr)[N]); ne fonctionne qu'avec des "array".
    Et les 2 autres syntaxes pour les "containers" (dont 1 chaîne de caractères std::begin) retourne effectivement 1 auto

    Et sinon, tu es au courant que begin c'est 1 fonction - phrase.begin c'est 1 pointeur de fonction - normal que cela ne fonctionne pas
    Donc +, std::string::iterator it_debut{phrase.begin()};.

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Ta première erreur me fait penser que ton std::string est constant, par conséquent, l'itérateur doit l'être aussi: std::string::const_iterator (ce n'est pas un simple const std::string::iterator).

    Le second problème devrait être remonté sous forme d'avertissement ou d'erreur C3867: https://godbolt.org/z/w2cE8s

    Et les 2 autres syntaxes pour les "containers" (dont 1 chaîne de caractères std::begin) retourne effectivement 1 auto
    Le type retourné est celui de decltype(cont.begin()), auto n'est pas un type...

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 759
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Le type retourné est celui de decltype(cont.begin()), auto n'est pas un type...
    Effectivement je n'ai pas l'habitude du C++ moderne qui t'en colle partout ... surtout avec la syntaxe lourde des "templates"

    Et ceci rejoint ce que dit la documentation "For (1), the same as returned by cont.begin()."

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Par défaut
    j'ai essayé std::string::iterator it_debut{phrase.begin()}; mais j'avais la même erreur qu'avec std::string::iterator it{std::begin(phrase)} et sinon, non mon std::string n'est pas un const, mais c'est assez incompréhensible cette erreur, j'avais eu la même sur un autre iterateur de string puis sans raison ça c'était mis à fonctionner sans que je ne change rien et ça ne fonctionne de nouveau plus.

    sinon cette syntaxe fonctionne sans problème avec array, vector et list.

    EDIT la deuxième erreur est une solution de rechange essayée un peu au pif parce que la première solution ne fonctionnait pas.

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 759
    Par défaut
    Le code ci-dessous compile avec le C++ moderne , mais pas avec le C++ 2003 ni 1998

    Mais mon compilateur, gcc, me dit directement le problème lorsque je compile en 2003/ 1998 (*)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <cstdlib>
    #include <string>
     
    /*****************************************************************************/
    /***********************************  Main  **********************************/
    /*****************************************************************************/
     
    int main(int argc, char** argv)
    {
        std::string phrase{"un exemple"};
        std::string::iterator it_debut01{ std::begin(phrase) };
        std::string::iterator it_debut02{ phrase.begin() };
     
        return EXIT_SUCCESS;
    }

    * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    dummy_main.cpp: Dans la fonction «*int main(int, char**)*»:
    dummy_main.cpp:10:23: warning: les listes d'initialisation étendues sont uniquement disponibles avec -std=c++11 ou -std=gnu++11
         std::string phrase{"un exemple"};
                           ^
    dummy_main.cpp:10:17: error: en C++98, «*phrase*» doit être initialisé par un constructeur et non par «*{...}*»
         std::string phrase{"un exemple"};
                     ^~~~~~
    dummy_main.cpp:11:37: warning: les listes d'initialisation étendues sont uniquement disponibles avec -std=c++11 ou -std=gnu++11
         std::string::iterator it_debut01{ std::begin(phrase) };
                                         ^
    dummy_main.cpp:11:44: error: «*begin*» n'est pas un membre de «*std*»
         std::string::iterator it_debut01{ std::begin(phrase) };
                                                ^~~~~
    dummy_main.cpp:11:27: error: en C++98, «*it_debut01*» doit être initialisé par un constructeur et non par «*{...}*»
         std::string::iterator it_debut01{ std::begin(phrase) };
                               ^~~~~~~~~~
    dummy_main.cpp:11:58: error: pas de fonction concordante pour l'appel à «*__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >::__normal_iterator(<initialisation de liste entre accolades>)*»
         std::string::iterator it_debut01{ std::begin(phrase) };
     
    [...]
     
    dummy_main.cpp:12:37: warning: les listes d'initialisation étendues sont uniquement disponibles avec -std=c++11 ou -std=gnu++11
         std::string::iterator it_debut02{ phrase.begin() };
                                         ^
    dummy_main.cpp:12:27: error: en C++98, «*it_debut02*» doit être initialisé par un constructeur et non par «*{...}*»
         std::string::iterator it_debut02{ phrase.begin() };

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Par défaut
    je suis en c++17 pourtant il doit bien y avoir un moyen de le faire, puisque auto y arrive

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        std::string str("toto");
        std::string::iterator it = str.begin();
        std::string::iterator it2(str.begin());
        std::string::iterator it3{ str.begin() };
        std::string::iterator it4 = std::begin(str);
        std::string::iterator it5(std::begin(str));
        std::string::iterator it6{ std::begin(str) };
    Compile parfaitement sous VS 2019 en c++14 et plus.

    Si tu espères qu'on trouve le problème il faut le code réel, la ligne de compilation entière et l'erreur complète.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Par défaut
    ah mais quel c** j'écrivais std::string iterator it_debut{std::begin(phrase} j'ai réécris tout le programme et la pas de souci. merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modifier une resource string en cours d'execution
    Par mapmip dans le forum VB.NET
    Réponses: 7
    Dernier message: 16/03/2011, 17h40
  2. Réponses: 4
    Dernier message: 26/09/2010, 18h48
  3. convertir mois en cours en String correspondant
    Par fiatlux dans le forum Langage
    Réponses: 4
    Dernier message: 14/12/2007, 11h33
  4. Réponses: 25
    Dernier message: 07/07/2007, 21h36
  5. [jEditorPane]Coloré un string, choisir le string en cours
    Par Terminator dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 12/04/2006, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo