Dienstag, Februar 18, 2020

Howto Erstellen Karte der Vektor Von Sortierten Daten

Habe ich die folgenden Daten, die als Eingabe (sortiert nach der ersten Spalte):

foo 1 2
foo 3 3
bar 10 11

Möchte ich eine Karte erstellen des Vektors mit der ersten Spalte als Schlüssel der Karte
so dass wir haben:

foo = {1,2,3,3}
bar = {10,11}

Aber warum mein code unten funktioniert nicht wie erwartet?

    #include <vector>
    #include <map>
    #include <iostream>
    #include <fstream>
    #include <sstream>

    using namespace std;

    int main  ( int arg_count, char *arg_vec[] ) {
        if (arg_count !=2 ) {
            cerr << "expected one argument" << endl;
            return EXIT_FAILURE;      
        }

        string line;         
        ifstream acemblyfile (arg_vec[1]); 

        map <string, vector<int> > myMapOfVec; 
        vector <string> myVec;  
        string KEY = "" ;    


        if (acemblyfile.is_open())
        {
            while (getline(acemblyfile,line) )
            {
                stringstream ss(line);    
                string KEY_TEMP;
                int VAL1;
                int VAL2;           

                ss >> KEY_TEMP >> VAL1 >> VAL2;

                MyVec.push_back(VAL1);   
                MyVec.push_back(VAL2);   


                if (KEY_TEMP != KEY) {     
                  myMapOfVec[KEY] = MyVec;
                  KEY = KEY_TEMP;            
                  MyVec.clear();          
                }

            }
            acemblyfile.close();      
        }
        else {
            cout << "Unable to open file"; 
        }


for( map<string, vector<int> >::iterator iter = myMapOfVec.begin(); iter != myMapOfVec.end(); ++iter ) {
       vector <int> tempVec = (*iter).second;
       string Key = (*iter).first;
       for (unsigned i =0; i<tempVec.size(); i++) {
          cout << Key << " " << tempVec[i] << endl;
       }
    }

        return 0;
    }
InformationsquelleAutor neversaint | 2009-03-16

3 Kommentare

  1. 16

    Als Mykola sagte, sollten Sie den Vektor in die Karte, anstatt selbst eins. Ich änderte deinen ganzen code, so funktioniert es für mich. Beachten Sie, dass Sie schrieb einige der Variablennamen wird groß – /Kleinschreibung (MyMapOfVec statt myMapOfVec) und dies führte zu compiler-Fehlern.

    Auch sicher sein, dass Sie nicht über einen Zeilenumbruch am Ende Ihrer Eingabe-Datei, da diese Folge in der Wiederholung der letzten Zeile.

    #include <vector>
    #include <map>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    using namespace std;
    
    int main  ( int arg_count, char *arg_vec[] ) {
        if (arg_count !=2 ) {
            cerr << "expected one argument" << endl;
            return EXIT_FAILURE;      
        }
    
        string line;         
        ifstream acemblyfile (arg_vec[1]); 
    
        map <string, vector<int> > myMapOfVec; 
        string KEY;    
    
    
        if (acemblyfile.is_open())
        {
            while (getline(acemblyfile, line) )
            {
                stringstream ss(line);    
                int VAL1;
                int VAL2;
    
                ss >> KEY >> VAL1 >> VAL2;
    
                myMapOfVec[KEY].push_back(VAL1);
                myMapOfVec[KEY].push_back(VAL2);
    
            }
            acemblyfile.close();      
        }
        else {
            cout << "Unable to open file"; 
        }
    
    
    for( map<string, vector<int> >::iterator iter = myMapOfVec.begin(); iter != myMapOfVec.end(); ++iter ) {
       vector<int> tempVec = (*iter).second;
       string Key = (*iter).first;
       cout << Key;
       for (unsigned i = 0; i < tempVec.size(); i++) {
          cout << " " << tempVec[i];
       }
       cout << endl;
    }
    
        return 0;
    }

    Für dein Beispiel ergibt die Ausgabe

    bar 10 11
    foo 1 2 3 3
  2. 1

    Nicht hinzufügen, überprüfen KEY_TEMP != SCHLÜSSEL. Da in Ihrem Fall sind Sie gleich wie foo geht zwei mal nacheinander. Nur

    myMapOfVec[KEY].push_back( VAL1 );
    myMapOfVec[KEY].push_back( VAL2 );

Kostenlose Online-Tests