#ifndef MOVINGMEDIAN_H #define MOVINGMEDIAN_H #include #include template class MovingMedian { private: /** up to "size" elements */ std::vector values; /** the number of elements to find the median within */ int size; public: /** ctor */ MovingMedian(const int size) : size(size) {;} /** add a new value */ void add(const T val) { // add new value values.push_back(val); // too many values? if ((int) values.size() > size) { values.erase(values.begin()); } } /** get the current median */ T get() const { // create a sorted copy (slow, but works) std::vector copy = values; std::sort(copy.begin(), copy.end()); // get the median if (values.size() % 2 != 0) { return copy[(copy.size() + 0) / 2]; } else { return (copy[copy.size() / 2 - 1] + copy[copy.size() / 2 + 0]) / 2; } } /** get the number of used entries */ int getNumUsed() const { return (int) values.size(); } /** get number of entries to get the median for */ int getSize() const { return size; } }; #endif // MOVINGMEDIAN_H