mapinhalt in vector schieben?



  • Gibts dafür irgendeine tolle funktion oder muss ich alles selbst mit einer forschleife machen? Dachte da an sowas wie

    vector.insert(map) oder so



  • Also wenn du das komplette map (sprich alle std::pair<Key,Value>) kopieren willst geht das recht hypsch.

    myvec.insert(myvec.begin(),mymap.begin(),mymap.end());
    

    BR
    evilissimo



  • Ich glaub ich bin zu blöd 🤡

    Ich hab das exakt so übernommen und den Vector gegen einen leeren Vector bei mir ausgetauscht und eine ganz normale map<string, MyClass> angegeben.

    **
    xutility(2228) : error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::pair<_Ty1,_Ty2>' akzeptiert (oder keine geeignete Konvertierung möglich)

    Sowie

    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    **

    Ich weiß nicht was damit gemeint ist?



  • =>

    std::map<int,std::string> mymap;
    
    std::vector<std::pair<int,std::string> > myvec;
    
    myvec.insert(myvec.begin(), mymap.begin(), mymap.end());
    

  • Mod

    war das nicht so, dass map den key als const T im pair ablegt? dann könnte es probleme geben, denn ein pair<const T,U> ist ja nicht in ein pair<T,U> (mit T non-const) konvertierbar (oder doch?). dann evtl. sowas:

    std::map<int,std::string> mymap;
    
    std::vector<std::pair<int,std::string> > myvec;
    
    std::pair<int,std::string> m2v(const std::pair<const int,std::string>& p)
    {
        return std::pair<int,std::string>( p.first, p.second );
    }
    
    std::transform( mymap.begin(), mymap.end(), std::inserter( myvec.begin() ), m2v );
    

    kann auch sein, dass ich völlig falsch liege.



  • camper schrieb:

    war das nicht so, dass map den key als const T im pair ablegt? dann könnte es probleme geben, denn ein pair<const T,U> ist ja nicht in ein pair<T,U> (mit T non-const) konvertierbar (oder doch?).

    Doch ist kopierbar. Es gibt einen "Copy-"Konstruktor der implizierte Konvertierung zulässt:

    template< typename FirstType , typename SecondType >
    template< typename OtherFirstType , typename OtherSecondType >
      pair<FirstType,SecondType>::pair( pair<OtherFirstType,OtherSecondType> const & ){
    ...
    

  • Mod

    evilissimo schrieb:

    camper schrieb:

    war das nicht so, dass map den key als const T im pair ablegt? dann könnte es probleme geben, denn ein pair<const T,U> ist ja nicht in ein pair<T,U> (mit T non-const) konvertierbar (oder doch?).

    Doch ist kopierbar. Es gibt einen "Copy-"Konstruktor der implizierte Konvertierung zulässt:

    template< typename FirstType , typename SecondType >
    template< typename OtherFirstType , typename OtherSecondType >
      pair<FirstType,SecondType>::pair( pair<OtherFirstType,OtherSecondType> const & ){
    ...
    

    ok. dann liegt der fehler woanders.



  • Ich empfehle die Verwendung von typedef und den typedefs der Container.

    typedef std::map<int,std::string> mymap_type;
    mymap_type mymap;
    
    std::vector<mymap_type::value_type> myvec_type;
    myvec_type myvec;
    
    myvec.insert(myvec.begin(), mymap.begin(), mymap.end());
    

    So kann nichts mehr schief gehen. Da brauchst Du Dir keine Gedanken mehr über std::pair und const und wie viele spitze Klammern und wo Leerzeichen zu machen. (Alle Probleme der Welt sind für immer gelöst 😉 )

    Tommi


  • Mod

    tntnet schrieb:

    Ich empfehle die Verwendung von typedef und den typedefs der Container.

    typedef std::map<int,std::string> mymap_type;
    mymap_type mymap;
    
    std::vector<mymap_type::value_type> myvec_type;
    myvec_type myvec;
    
    myvec.insert(myvec.begin(), mymap.begin(), mymap.end());
    

    So kann nichts mehr schief gehen. Da brauchst Du Dir keine Gedanken mehr über std::pair und const und wie viele spitze Klammern und wo Leerzeichen zu machen. (Alle Probleme der Welt sind für immer gelöst 😉 )

    Tommi

    wäre schön gewesen, dummerweise bist du jetzt tatsächlich in die const falle getappt. mymap_type::value_type erfüllt die container bedingungen nicht (CopyAssignable). 😉


Anmelden zum Antworten