Map <int,std::vector<int> >



  • Hi zusammen,

    ich wollte fragen ob es möglich ist in eine std::map folgende Einträge zu speichern:

    Map <int,std::vector<int> >
    

    Also als Key einen int und als Wert einen std::vector;
    Bei der Initialisierung gibt es zwar keine Fehlermedlung, aber sobald ich einen
    std::vector<int> in diese map einfügen möchte gibt es eine Fehlermeldung.
    Daher die Frage ob dies überhaupt möglich ist.

    Und wenn nicht welchen Datentyp könnte ich dann sonst verwerden?



  • Davon abgesehen das es std::map und nicht Map lautet (vertippt?), sollte nichts dagegen sprechen. In der Regel kann alles in eine Map was einen Standard-Konstruktor hat.

    Zeig doch einmal den Fehler und den entsprechenden Code-Teil.



  • redbomber schrieb:

    Daher die Frage ob dies überhaupt möglich ist.

    Ja, ich kenne sogar Fälle in denen der Wert ein doppelt verschachtelter Vektor ist. Sind Datentypen wie jeder andere auch.



  • redbomber schrieb:

    Hi zusammen,
    ich wollte fragen ob es möglich ist in eine std::map folgende Einträge zu speichern:

    Map <int,std::vector<int> >
    

    ja, das funktioniert einwandfrei. Jedoch würd eich einen typedef drauf loslassen, damit der Code am Ende auch noch lesbar ist:

    typedef std::map <int,std::vector<int> > MyMap; //also hier eine intelligente Bezeichnugn ausdenken
    typedef std::map <int,std::vector<int> >::iterator MyMapIt; //den brauch man häufig
    


  • Also vielen Dank schonmal, habe jetzt auch den Fehler gefunden woran es (vermutlich) lag.

    Initialisiert habe ich es wie folgt:

    std::map<int, std::vector<int> > allSignalClusters;
    std::map<int, std::vector<int> >::iterator iter;
    

    Befüllt wird die Map in der folgenden Methode:

    void Cluster::addSignalToCluster(int signalId, int clusterId){
       iter = allSignalClusters.find(clusterId);
    
       // Key nicht vorhanden
       if(iter == allSignalClusters.end()){
    		std::vector<int> templist;
    		templist.push_back(signalId);
    		allSignalClusters.insert ( std::pair<int,std::vector<int> >(clusterId,templist) );
    	}
    	// Key vorhanden
    	else{
    		std::vector<int> templist = iter->second ;
    		templist.push_back(signalId);
    		allSignalClusters.insert ( std::pair<int,std::vector<int> >(clusterId,templist) );
    }
    }
    


  • //...
     allSignalClusters[clusterId] = templist;
    // allSignalClusters.insert ( std::pair<int,std::vector<int> >(clusterId,templist) );
    //...
    


  • Aber wie iteriere ich denn jetzt über die map.
    Ich kenne dies aus Java, wo ich mir für die Map einen keyset ausgeben lassen kann. Ich iteriere dann über den keyset und greife somit auf die Werte in der map zu.

    ich probiere dies gerade so:

    std::vector<int> temp = allNodeClusters.find(???)->second;
    

    Also was muss da anstelle von ??? rein?



  • und wenn du es noch uebersichtlicher haben und auf unnötige vector Kopien verzichten möchtest:

    void Cluster::addSignalToCluster(int signalId, int clusterId)
    {
       iter = allSignalClusters.find(clusterId);
    
       // Key nicht vorhanden
       if(iter == allSignalClusters.end())
       {
          allSignalClusters[clusterId] = std::vector<int>(1,signalId);
       }
       else
       {
            allSignalClusters[clusterId] = iter->second ;
            allSignalClusters[clusterId].push_back(signalId);
       }
    }
    


  • redbomber schrieb:

    Aber wie iteriere ich denn jetzt über die map.
    Ich kenne dies aus Java, wo ich mir für die Map einen keyset ausgeben lassen kann. Ich iteriere dann über den keyset und greife somit auf die Werte in der map zu.

    ich probiere dies gerade so:

    std::vector<int> temp = allNodeClusters.find(???)->second;
    

    Also was muss da anstelle von ??? rein?

    z.B. so, oder du baust dir ein Prädiktor und nutzt std-Algortihms, z.B. for_eacht, etc. pp.

    {
      std::vector<int>::iterator vpos;
      std::map<int, std::vector<int> >::iterator mpos;
    
      for(mpos=myMap.begin(); mpos!=myMap.end(); ++mpos)
      {
        for(vpos=mpos->second.begin(); vpos!=mpos->second.end(); ++vpos)
        {  
           std::cout << *vpos << endl;
        }
      }
    }
    


  • Wobei bei der Funktion du eh nur eines brauchst:

    allSignalClusters[clusterId].push_back(signalId);
    

    Sollte noch kein vector unter der ClusterID liegen wird er in dem Moment angelegt.



  • Fellhuhn schrieb:

    Wobei bei der Funktion du eh nur eines brauchst:

    allSignalClusters[clusterId].push_back(signalId);
    

    Sollte noch kein vector unter der ClusterID liegen wird er in dem Moment angelegt.

    lol, stimmt...


Log in to reply