for_each und functor
-
hallo
habe mal wieder ein problemchen, denke ihr könnt helfen.
habe eine klasse gebastelt, die die gesamt arbeitsstunden
in einer multimap errechnen soll :class Add { private: Arbeitsstunden summe; public: Add() : summe(0.0, 0.0, 0.0) {} void operator() (const std::pair<Datum,Arbeitsstunden>& p) { summe += p.second; } Arbeitsstunden& ergebnis() { return summe; } };
for_each erhält eine instanz dieser klasse (Add add):
for_each(mymap.begin(),mymap.end(),add);
nun möchte ich mit
cout<< add.ergebnis();
die gesamt stunden ausgeben lassen. erhalte aber immer
o arbeitsstunden.weis jemand an was das liegt?gruß elwida
-
Ich rat mal in den blauen Dunst: Könnte der op+= von Arbeitsstunden kaputt sein?
-
glaube nicht, denn wenn ich cout<< add.ergebnis() vom
operator() in der for_each schleife mit aufrufen lasse
wir die addition korrekt durchgeführt.gruß elwida
-
nur eine idee am rande..
wie sieht es mit den datentypen aus? gibt es eventuell eine ungewollte interne typumwandlung nach integer, die dir immer den rest abschneidet und dann schließ und endlich 0 rauskommt?
-
doppel
-
hab die klasse etwas abgeändert
class Add { private: Arbeitsstunden& summe; public: Add(Arbeitsstunden&a) : summe(a) {} void operator() (const std::pair<Datum,Arbeitsstunden>& p) { summe += p.second;} Arbeitsstunden& ergebnis() { return summe; } };
nun funktioniert es, aber ich weis immer noch nicht
so recht wieso es bei der ersten version nicht
funktionierte?
-
doppel post
-
Weil for_each mit kopien arbeitet und nicht mit Referenzen.
Schreib mal:
Add add=for_each(mymap.begin(), mymap.end(), Add());
cout<<add.ergebnis();Wobei Add == dein ursprüngliches Add
denn deine 'neue' Variante finde ich nicht besonders.
-
btw: std::accumulate wäre wohl passender
-
@Shade Of Mine
Weil for_each mit kopien arbeitet und nicht mit Referenzen.bingo genau das war es
dankegruß elwida