#include <iostream>
#include <vector>
template<class T, size_t MaxSize>
class TopN
{
public:
void push_back(T v)
{
if (m_vector.size() < MaxSize)
m_vector.push_back(v);
else
m_vector[m_pos] = v;
if (++m_pos == MaxSize)
m_pos = 0;
}
class DummyIterator
{
public:
TopN &r; // a direct reference to our boss.
int p, m; // m: how many elements we can pull from vector, p: position of the cursor.
DummyIterator(TopN& t) : r(t), p(t.m_pos), m(t.m_vector.size()){}
operator bool() const { return (m > 0); }
T& operator *()
{
static T e = 0; // this could be removed
if (m <= 0) // if someone tries to extract data from an empty vector
return e; // instead of throwing an error, we return a dummy value
m--;
if (--p < 0)
p = MaxSize - 1;
return r.m_vector[p];
}
};
decltype(auto) begin() { return m_vector.begin(); }
decltype(auto) end() { return m_vector.end(); }
DummyIterator get_dummy_iterator()
{
return DummyIterator(*this);
}
private:
std::vector<T> m_vector;
int m_pos = 0;
};
template<typename T, size_t S>
void show(TopN<T,S>& t)
{
for (auto it = t.get_dummy_iterator(); it; )
std::cout << *it << '\t';
std::cout << std::endl;
};
int main(int argc, char* argv[])
{
TopN<int,10> top10;
for (int i = 1; i <= 10; i++)
top10.push_back(5 * i);
show(top10);
top10.push_back(60);
show(top10);
top10.push_back(65);
show(top10);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8Y2xhc3MgVCwgc2l6ZV90IE1heFNpemU+CmNsYXNzIFRvcE4KewpwdWJsaWM6CiAgICB2b2lkIHB1c2hfYmFjayhUIHYpCiAgICB7CiAgICAgICAgaWYgKG1fdmVjdG9yLnNpemUoKSA8IE1heFNpemUpCiAgICAgICAgICAgIG1fdmVjdG9yLnB1c2hfYmFjayh2KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG1fdmVjdG9yW21fcG9zXSA9IHY7CgogICAgICAgIGlmICgrK21fcG9zID09IE1heFNpemUpCiAgICAgICAgICAgIG1fcG9zID0gMDsKICAgIH0KCiAgICBjbGFzcyBEdW1teUl0ZXJhdG9yCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgVG9wTiAmcjsgLy8gYSBkaXJlY3QgcmVmZXJlbmNlIHRvIG91ciBib3NzLgogICAgICAgIGludCBwLCBtOyAvLyBtOiBob3cgbWFueSBlbGVtZW50cyB3ZSBjYW4gcHVsbCBmcm9tIHZlY3RvciwgcDogcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KCiAgICAgICAgRHVtbXlJdGVyYXRvcihUb3BOJiB0KSA6IHIodCksIHAodC5tX3BvcyksIG0odC5tX3ZlY3Rvci5zaXplKCkpe30KCiAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtID4gMCk7IH0KCiAgICAgICAgVCYgb3BlcmF0b3IgKigpCiAgICAgICAgewogICAgICAgICAgICBzdGF0aWMgVCBlID0gMDsgLy8gdGhpcyBjb3VsZCBiZSByZW1vdmVkCiAgICAgICAgICAgIGlmIChtIDw9IDApIC8vIGlmIHNvbWVvbmUgdHJpZXMgdG8gZXh0cmFjdCBkYXRhIGZyb20gYW4gZW1wdHkgdmVjdG9yCiAgICAgICAgICAgICAgICByZXR1cm4gZTsgLy8gaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvciwgd2UgcmV0dXJuIGEgZHVtbXkgdmFsdWUKCiAgICAgICAgICAgIG0tLTsKCiAgICAgICAgICAgIGlmICgtLXAgPCAwKQogICAgICAgICAgICAgICAgcCA9IE1heFNpemUgLSAxOwoKICAgICAgICAgICAgcmV0dXJuIHIubV92ZWN0b3JbcF07CiAgICAgICAgfQogICAgfTsKCiAgICBkZWNsdHlwZShhdXRvKSBiZWdpbigpIHsgcmV0dXJuIG1fdmVjdG9yLmJlZ2luKCk7IH0KICAgIGRlY2x0eXBlKGF1dG8pIGVuZCgpIHsgcmV0dXJuIG1fdmVjdG9yLmVuZCgpOyB9CgogICAgRHVtbXlJdGVyYXRvciBnZXRfZHVtbXlfaXRlcmF0b3IoKQogICAgewogICAgICAgIHJldHVybiBEdW1teUl0ZXJhdG9yKCp0aGlzKTsKICAgIH0KcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPFQ+IG1fdmVjdG9yOwogICAgaW50IG1fcG9zID0gMDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPgp2b2lkIHNob3coVG9wTjxULFM+JiB0KQp7CiAgICBmb3IgKGF1dG8gaXQgPSB0LmdldF9kdW1teV9pdGVyYXRvcigpOyBpdDsgKQogICAgICAgIHN0ZDo6Y291dCA8PCAqaXQgPDwgJ1x0JzsKCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICAgVG9wTjxpbnQsMTA+IHRvcDEwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTA7IGkrKykKICAgICAgICB0b3AxMC5wdXNoX2JhY2soNSAqIGkpOwoKICAgIHNob3codG9wMTApOwoKICAgIHRvcDEwLnB1c2hfYmFjayg2MCk7CiAgICBzaG93KHRvcDEwKTsKCiAgICB0b3AxMC5wdXNoX2JhY2soNjUpOwogICAgc2hvdyh0b3AxMCk7CgogICAgcmV0dXJuIDA7Cn0K