0
votes

Comment convertir auto (pour le vecteur ) de C ++ 11 à C ++ 98?

J'ai ce code en C ++ 11:

bool Analizator_L::eStareFinala(int q)
{
    for (vector<int>::iterator x = stariFinale.begin(); x!= stariFinale.end(); x++)
        if (q == x)
            return true;
    return false;
}

Et j'ai essayé de le convertir en C ++ 98 comme:

vector<int> stariFinale;

bool LexAnalyzer::eStareFinala(int q)
{
    for (auto x : stariFinale)
        if (q == x)
            return true;
    return false;
}

ce qui me donne l'erreur aucune correspondance pour 'operator ==' dans 'q == x'

S'il vous plaît, aidez.


1 commentaires

Inclure le message d'erreur du compilateur textuellement, plutôt que de le paraphraser, rendrait la question plus utile aux futurs lecteurs.


3 Réponses :


2
votes

Comme ceci if (q == * x)

Utilisez * pour obtenir l'élément sur lequel l'itérateur pointe.


0 commentaires

3
votes

Maintenant que vous avez un itérateur, pas la valeur, vous devez donc le déréférencer. Et veuillez utiliser prefix ++, pas postfix ++. Postfix ++ doit créer un préfixe temporaire, non ++, comparez la section relative à l'application de http : //isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rp-waste .

return std::find(stariFinale.begin(), stariFinale.end(), q) != stariFinale.end();

Une autre option qui nécessite moins de changements de code est d'avoir l'itérateur et l'ancienne variable x:

for (vector<int>::iterator iter = stariFinale.begin(); iter != stariFinale.end(); ++iter) {
    int x = *iter;
    if (q == x)
        return true;
}

Encore mieux dans votre cas: n'écrivez pas la boucle vous-même, utilisez un algorithme standard (comparez http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-lib ). Votre fonction pourrait être implémentée en utilisant std::find.

for (vector<int>::iterator x = stariFinale.begin(); x != stariFinale.end(); ++x)
    if (q == *x)
        return true;


2 commentaires

Bien que vos commentaires sur le préfixe préfixe à postfix soient bons, il faut noter que la plupart des compilateurs choisiront cette valeur inutilisée et la factoriseront. Cela dépend cependant peut-être de vos indicateurs d'optimisation.


@TarickWelling Je suis d'accord si je parle d'un type intégré comme int , mais pour les objets itérateur, il est beaucoup plus difficile pour l'optimiseur de le voir car il nécessite une insertion et plus encore. Le compilateur peut optimiser dans le cas de l'itérateur, mais il peut également ne pas optimiser.



0
votes

Ce code fonctionnera en C ++ 98 et C ++ 11 ou version ultérieure:

bool LexAnalyzer::eStareFinala(int q)
{
    return std::find( stariFinale.begin(), stariFinale.end(), q ) != stariFinale.end();
}


0 commentaires