3 votes

La pré-incrémentation ne fonctionne pas comme prévu

J'essaie d'apprendre la programmation dynamique en résolvant quelques questions en ligne. L'une des questions que j'ai trouvées demande de traiter l'entrée suivante

4 10 3 4 4 5 6 7 5 7

Le premier indique le nombre d'articles, le second la capacité totale et les quatre autres (par paire) devraient maintenant indiquer la valeur et la capacité.

Le problème que je rencontre est celui du code qui l'analyse.

#include<iostream>
#include<map>
#include<iterator>
using namespace std;

template<typename T>
void print(typename T::const_iterator start,
           typename T::const_iterator end)
{
    typename T::const_iterator itr=start;
    while(itr!=end)
    {
        std::cout << itr->first << " " << itr->second << std::endl;
        itr++;
    }
}

int main()
{
    int _M_N; // total numbers
    int _M_V; // total values
    std::map<int,int> _M_Values; 

    istream_iterator<int> isi(cin); 
    _M_N = *isi;
    _M_V = *++isi;

    for(int i=0;i<_M_N;i++)
    {
        //int m=*++isi,n=*++isi;
        //_M_Values.insert(make_pair(m,n));
        _M_Values.insert(make_pair(*++isi,*++isi)); 
    }
    print<std::map<int,int> >(_M_Values.begin(),_M_Values.end()); 
}

Lorsque j'exécute ce programme, j'obtiens une sortie erronée pour cette entrée.

   akhetarp@desktop> knapsack < test
   4 3 
   5 4 
   7 6

Si je décommente la ligne et commente la ligne précédente pour l'insérer, j'obtiens le résultat escompté.

   int m=*++isi,n=*++isi;
   _M_Values.insert(make_pair(m,n));
   // _M_Values.insert(make_pair(*++isi,*++isi));

   3 4
   4 5 
   6 7 
   5 7 

Je sais qu'il doit s'agir d'une erreur de base. Merci d'avance,

8voto

Vous manquez un point de séquence ici :

 _M_Values.insert(make_pair(*++isi,*++isi)); 

La virgule dans une déclaration en est une, la virgule dans une fonction n'en est pas une :

int m=*++isi,n=*++isi;

Jetez un coup d'œil : http://en.wikipedia.org/wiki/Sequence_point

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X