Я думаю, что это довольно распространенный вопрос, но, похоже, я не могу найти ответ путем поиска по сайту (может быть, есть более точное имя для проблемы, которую я не знаю?)
Вам нужно реализовать структуру с методом "hit()", используемым для сообщения о хитах и методах hitInLastSecond | Minute | Hour. У вас есть таймер с точностью до наносекунды. Как вы эффективно реализуете это?
Моя мысль была чем-то вроде этого (в psuedo-С++)
class HitCounter {
void hit() {
hits_at[now()] = ++last_count;
}
int hitsInLastSecond() {
auto before_count = hits_at.lower_bound(now() - 1 * second)
if (before_count == hits_at.end()) { return last_count; }
return last_count - before_count->second;
}
// etc for Minute, Hour
map<time_point, int> hits_at;
int last_count = 0;
};
Это работает? Это хорошо? Что-то лучше?
Обновление: добавлена обрезка и переключена на deque в соответствии с комментариями:
class HitCounter {
void hit() {
hits.push_back(make_pair(now(), ++last_count));
}
int hitsInLastSecond() {
auto before = lower_bound(hits.begin(), hits.end(), make_pair(now() - 1 * second, -1));
if (before == hits.end()) { return last_count; }
return last_count - before_count->second;
}
// etc for Minute, Hour
void prune() {
auto old = upper_bound(hits.begin(). hits.end(), make_pair(now - 1 * hour, -1));
if (old != hits.end()) {
hits.erase(hits.begin(), old)
}
}
deqeue<pair<time_point, int>> hits;
int last_count = 0;
};