cin.getline() est en sautant d'une entrée en C++

Si j'utilise le code suivant, getline ne pas prendre la dernière entrée(pour la dernière itération de la boucle "for", c'est tout simplement l'ignore) -

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c); //here it skips the input for last iteration
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}

Pour se débarrasser d'elle, j'ai mis de la cin.ignore() après getline. Maintenant sa prise de toutes les entrées, mais je suis confronté à un nouveau problème -

#include<iostream>
#include<string>
#include<map>
#include<set>
#include<sstream>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c);
            cin.ignore();
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}

Le nouveau problème c'est que pendant la prise de c2, le premier caractère de la chaîne est supprimée. Par exemple, si je donne "l'Angleterre de Jane Doe" comme entrée pour getline, c2, je vais devenir "ngland".

Comment se débarrasser de ce problème aujourd'hui?

Le mélange >> et getline est délicate. Dans tous les cas, vous n'avez jamais case le résultat de soit, alors pourquoi voudriez-vous même que votre code de travail?
(*ci).first plus facile à lire que ci->first
double possible de utiliser getline(cin, s) après le cin

OriginalL'auteur theharshest | 2012-04-17