#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
template < class T>
struct PredRetainMax;
template < class Time, class Val>
struct PredRetainMax< std:: pair < Time, Val>>
{
PredRetainMax( Time cutoff, Val& m) : _cutoff( cutoff) , _max( m) { }
bool operator( ) ( const std:: pair < Time, Val> & s)
{
//if older than cutoff, remove
if ( s.first < _cutoff) return true ;
//otherwise, keep and update max
_max = std:: max ( _max, s.second ) ;
return false ;
}
Val get( ) { return _max; }
private :
Time _cutoff;
Val& _max;
} ;
std:: ostream & operator<< ( std:: ostream & ostr, const std:: list < std:: pair < unsigned , double >> & list)
{
for ( auto & i : list) {
ostr << "<" << i.first << "," << i.second << "> " ;
}
return ostr;
}
int main( )
{
using sample = std:: pair < unsigned , double > ;
using pred = PredRetainMax< sample> ;
sample a{ 1 ,12.2 } ;
sample b{ 2 ,11.778 } ;
sample c{ 3 ,9.2 } ;
sample d{ 4 ,- 2.6 } ;
sample e{ 5 ,10.1 } ;
std:: list < sample> samples{ d,c,b,a } ;
cout << "original list is: " << samples << endl << endl;
double maxval( - std:: numeric_limits < double > :: infinity ( ) ) ;
//eliminate samples older than 2
samples.remove_if ( pred( 2 , maxval) ) ;
cout << "max is: " << maxval << ", list is: " << samples << endl << endl;
//add new value
samples.push_front ( e) ;
//reset max
maxval = - std:: numeric_limits < double > :: infinity ( ) ;
//eliminate samples older than 2
samples.remove_if ( pred( 2 , maxval) ) ;
cout << "max is: " << maxval << ", list is: " << samples << endl << endl;
//reset max
maxval = - std:: numeric_limits < double > :: infinity ( ) ;
//eliminate samples older than 3
samples.remove_if ( pred( 3 , maxval) ) ;
cout << "max is: " << maxval << ", list is: " << samples << endl << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBQcmVkUmV0YWluTWF4OwoKdGVtcGxhdGU8Y2xhc3MgVGltZSwgY2xhc3MgVmFsPgpzdHJ1Y3QgUHJlZFJldGFpbk1heDxzdGQ6OnBhaXI8VGltZSwgVmFsPj4KewoJUHJlZFJldGFpbk1heChUaW1lIGN1dG9mZiwgVmFsJiBtKSA6X2N1dG9mZihjdXRvZmYpLCBfbWF4KG0pIHt9Cglib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPFRpbWUsIFZhbD4mIHMpCgl7CiAgICAgICAgLy9pZiBvbGRlciB0aGFuIGN1dG9mZiwgcmVtb3ZlCiAgICAgICAgaWYgKHMuZmlyc3QgPCBfY3V0b2ZmKSByZXR1cm4gdHJ1ZTsKICAgICAgICAvL290aGVyd2lzZSwga2VlcCBhbmQgdXBkYXRlIG1heAogICAgICAgIF9tYXggPSBzdGQ6Om1heChfbWF4LCBzLnNlY29uZCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwoJfQoJVmFsIGdldCgpIHsgcmV0dXJuIF9tYXg7IH0KcHJpdmF0ZToKCVRpbWUgX2N1dG9mZjsKCVZhbCYgX21heDsKfTsKCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zdHIsIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnBhaXI8dW5zaWduZWQsIGRvdWJsZT4+JiBsaXN0KQp7Cglmb3IgKGF1dG8gJmkgOiBsaXN0KSB7CgkJb3N0ciA8PCAiPCIgPDwgaS5maXJzdCA8PCAiLCIgPDwgaS5zZWNvbmQgPDwgIj4gIjsKCX0KCXJldHVybiBvc3RyOwp9CgppbnQgbWFpbigpCnsKCXVzaW5nIHNhbXBsZSA9IHN0ZDo6cGFpcjx1bnNpZ25lZCwgZG91YmxlPjsKCXVzaW5nIHByZWQgPSBQcmVkUmV0YWluTWF4PHNhbXBsZT47CgoJc2FtcGxlIGF7IDEsMTIuMiB9OwoJc2FtcGxlIGJ7IDIsMTEuNzc4IH07CglzYW1wbGUgY3sgMyw5LjIgfTsKCXNhbXBsZSBkeyA0LC0yLjYgfTsKCXNhbXBsZSBleyA1LDEwLjEgfTsKCglzdGQ6Omxpc3Q8c2FtcGxlPiBzYW1wbGVzeyBkLGMsYixhIH07Cgljb3V0IDw8ICJvcmlnaW5hbCBsaXN0IGlzOiAiIDw8IHNhbXBsZXMgPDwgZW5kbCA8PCBlbmRsOwoKCWRvdWJsZSBtYXh2YWwoLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CgkvL2VsaW1pbmF0ZSBzYW1wbGVzIG9sZGVyIHRoYW4gMgoJc2FtcGxlcy5yZW1vdmVfaWYocHJlZCgyLCBtYXh2YWwpKTsKCWNvdXQgPDwgIm1heCBpczogIiA8PCBtYXh2YWwgPDwgIiwgbGlzdCBpczogIiA8PCBzYW1wbGVzIDw8IGVuZGwgPDwgZW5kbDsKCgkvL2FkZCBuZXcgdmFsdWUKCXNhbXBsZXMucHVzaF9mcm9udChlKTsKCS8vcmVzZXQgbWF4CgltYXh2YWwgPSAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwoJLy9lbGltaW5hdGUgc2FtcGxlcyBvbGRlciB0aGFuIDIKCXNhbXBsZXMucmVtb3ZlX2lmKHByZWQoMiwgbWF4dmFsKSk7Cgljb3V0IDw8ICJtYXggaXM6ICIgPDwgbWF4dmFsIDw8ICIsIGxpc3QgaXM6ICIgPDwgc2FtcGxlcyA8PCBlbmRsIDw8IGVuZGw7CgoJLy9yZXNldCBtYXgKCW1heHZhbCA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CgkvL2VsaW1pbmF0ZSBzYW1wbGVzIG9sZGVyIHRoYW4gMwoJc2FtcGxlcy5yZW1vdmVfaWYocHJlZCgzLCBtYXh2YWwpKTsKCWNvdXQgPDwgIm1heCBpczogIiA8PCBtYXh2YWwgPDwgIiwgbGlzdCBpczogIiA8PCBzYW1wbGVzIDw8IGVuZGwgPDwgZW5kbDsKCglyZXR1cm4gMDsKfQ==
stdout
original list is: <4,-2.6> <3,9.2> <2,11.778> <1,12.2>
max is: 11.778, list is: <4,-2.6> <3,9.2> <2,11.778>
max is: 11.778, list is: <5,10.1> <4,-2.6> <3,9.2> <2,11.778>
max is: 10.1, list is: <5,10.1> <4,-2.6> <3,9.2>