c++ - Unordered_map,检查滑动窗口中的阈值

标签 c++

我有一个 unordered_map,键代表一小时中的分钟数(从 0 到 60),值代表那一分钟的事件数。

我想要的是在给定的窗口大小下检查总事件是否高于某个阈值。

例如,假设我有这个 unordered_map=[(4,3),(5,2),(7,2)] 窗口大小 = 3(分钟) 阈值 = 6

所以在这个例子中,我没有一个 3 分钟的窗口包含超过 6 个事件,但是如果窗口大小 = 4 那么就可以。

解决这个问题的最佳方法是什么?我想将 unordered_map 复制到 map ,因为它是键排序的。

接下来我想有一个滑动窗口,每次添加新元素并删除最旧的元素,但我很难做到这一点,因为没有事件的分钟不会显示在 map 中(比如第 6 分钟) )m 我该如何克服这个问题? (我不想手动添加像 (6,0) 这样的空分钟,因为它们太多了,超过了事件分钟数)

谢谢

最佳答案

我不知道这是否是最佳方法,但我会使用 map 而不是 unordered_map,使用迭代器来连续加载将元素添加到临时 list 中,只要它们在窗口内并从那里检查它们的总事件

std::map<int, int> map{ {4,3},{5,2},{7,2} };
std::list<std::pair<int, int>> list;
const int threshold = 6, window = 4;
for (auto it = map.begin(); it != map.end(); ++it)
{
    while (list.size() > 0 && it->first - list.front().first >= window)
        list.pop_front();
    list.push_back(*it);

    int count = 0;
    for (auto e : list)
        count += e.second;
    if (count > threshold)
        std::cout << "over threshold" << std::endl;
}
std::cout << "end" << std::endl;

试试cloliru !

关于c++ - Unordered_map,检查滑动窗口中的阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43893095/

相关文章:

继承引用成员的构造函数中的 C++ 默认初始化

c++ - 如何理解函数参数中的星号(*)?

c++ - 我如何判断 C++ 程序何时正在等待输入?

java - 在 Ubuntu Linux 中查找 C/C++ 源代码的最佳工具是什么?

c++ - gtkmm Append_column(TreeViewColumn) 不显示任何内容

c++ - Objective-C - 以编程方式设置自定义 Mac 屏幕分辨率

c++ - 如何仅在所有任务完成后才使用c++中的boost向线程池添加新任务

c++ - 自定义 C++ 断言宏

c++ - 设置 union 不起作用

c++ - 我的 UI 元素和模型对象应该有什么级别的分离?