Mittelwertfunktion für maps
-
Juten tag und frohes neues Jahr.
Ich wollt euch mal um Kommentare und Verbesserungsvorschläge zu folgender kleiner Funktion bitten (vor allem Zwecks Verbesserung meines Stils...)template <class Key, class T> T average(Key kfirst, Key klast, const std::map<Key, T>& where) /********************************** * * Bildet den Mittelwert vom Typ T aller Werte aus where, * deren keys sich zwischen kfirst und klast befinden * Als Vergleichsoperator wird * std::map<Key, T>::where.key_comp() benutzt * * @requires: * T() defined (standard constructor) * T operator+= (T) defined * T operator/ (T, int) defined * **********************************/ { int i = 0; T result = T(); for (typename std::map<Key, T>::const_iterator it = where.begin(); it != where.end(); it++) if (where.key_comp()(kfirst, it->first) && where.key_comp()(it->first, klast)) { i++; result += it->second; } if (i != 0) return result/i; return result; }
-
Ist etwas umständlich, finde ich. In einer map stehen die Werte geordnet drin, also kannst du gleich deinen Suchbereich einschränken auf where.lower_bound(kfirst) bis where.lower_bound(klast).
-
also reicht folgendes:
{ int i = 0; T result = T(); for (typename std::map<Key, T>::const_iterator it = where.lower_bound(kfirst); it != where.lower_bound(klast); it++) { i++; result += it->second; } if (i != 0) return result/i; return result; }
-
Abgesehen davon, daß du den Methodennamen richtig schreiben solltest, ja.
Anmerkung: Die Schleife bildet den Mittelwert aller Elemente >=kfirst und <klast - wenn das nicht korrekt ist, mußt du die Randwerte der Schleife eventuell nachbessern.