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.


Anmelden zum Antworten