multimap und copy



  • Hallo
    brauche bitte nochmal eure hilfe.
    habe eine multimap angelegt

    typedef multimap<long,Arbeitsstunden> mp;
    

    und mit werten gefüllt.
    für die Klasse Arbeitsstunden ist der operator<< überladen.
    nun versuche ich diese map mit

    copy(mymap.begin(), mymap.end(),ostream_iterator<mp::value_type>(cout,", "));
    

    auszugeben,erhalte aber diesen fehler:

    c:\programme\microsoft visual studio\vc98\include\iterator(203) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'const struct std::pair<long const ,class Arbeitsstunden>' (or there is no acceptable conversion)
    c:\programme\microsoft visual studio\vc98\include\iterator(203) : while compiling class-template member function 'class std::ostream_iterator<struct std::pair<long const ,class Arbeitsstunden>,char,struct std::char_traits<char> > &__thiscall
    std::ostream_iterator<struct std::pair<long const ,class Arbeitsstunden>,char,struct std::char_traits<char> >::operator =(const struct std::pair<long const ,class Arbeitsstunden> &)'

    so richtig werde ich aus der meldung nicht schlau
    muß ich für pair noch einmal den operator<< überladen??

    gruß elwida



  • dein Problem ist hier, dass ein (multi)map Iterator ein std::pair ist! Dafür gibt es aber kein operator<<. Eine möglichkeit hier wäre, wenn du den operator<< für std::pair eben erzeugst



  • ich würde die ausgabe über for_each machen
    der functor gibt dann das pair an den stream aus.



  • ist dies legal?

    ostream& operator<<(ostream& os,multimap<long,Arbeitsstunden>&a)
    {
    	typedef multimap<long,Arbeitsstunden>::iterator ps;
    	ps p;
    	for(p=a.begin(); p!=a.end();p++)
    	{
    	os<<p->first<<p->second;
    	}
    	return os;
    
    }
    

    dies soll außerdem meinen vector in eine datei schreiben können

    gruß elwida



  • war der code so erschreckend schlecht
    das keiner mehr antwortet?

    @ Shade Of Mine
    wenn ich for_each verwende wie müsste der functor
    dann aussehen damit ich auch meine map in eine
    datei schreiben könnte?

    gruß elwida



  • functor als idee:

    struct functor
    {
      ostream* out;
      functor(ostream* out) : out(out) {}
      template<typename Key, typename Val>
      void operator()(pair<Key, Val> const& p)
      {
        (*out)<<p.first<<" = "<<p.second<<'\n';
      }
    }
    

    deinen code finde ich nicht so gut, da du nen op<< für eine spezielle map definierst. dies kann zu unerwarteten verhalten führen, wenn jemand die gleiche map woanders anlegt...

    ansonsten würde ich a const machen...



  • suuper tausend dank Shade

    gruß elwida


Anmelden zum Antworten