2009-03-16 3 views
9

Ich habe folgende Daten als Eingabe (nach ersten Spalte sortiert):Howto erstellen Karte von Vector Von sortierten Daten

foo 1 2 
foo 3 3 
bar 10 11 

ich eine Karte von Vektor mit ersten Spalte als Schlüssel der Karte erstellen möchten solche das haben wir:

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

Aber warum funktioniert mein Code unten 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; 
    } 

Antwort

16

Wie Mykola sagte, sollten Sie den Vektor in der Karte verwenden, anstatt einen selbst zu erstellen. Ich habe Ihren gesamten Code geändert, damit er für mich funktioniert. Beachten Sie, dass Sie einige der Variablennamen mit falscher Groß-/Kleinschreibung geschrieben haben (MyMapOfVec anstelle von myMapOfVec), was zu Compilerfehlern führte.

Vergewissern Sie sich auch, dass Sie am Ende der Eingabedatei keinen Zeilenumbruch haben, da dies zur Wiederholung der letzten Zeile führt.

#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 Ihr Beispiel gibt das dem Ausgang

bar 10 11 
foo 1 2 3 3 
1

Fügen Sie keine Überprüfung für KEY_TEMP hinzu! = KEY. Denn in deinem Fall sind sie gleich wie foo geht zwei mal eins nach dem anderen. Nur

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