c++ - std::queue 和 std::deque 清理

标签 c++ stl std

假设我们有一种情况需要 FIFO 数据结构。例如,按事件进来的顺序消费一些事件。

此外,我们需要不时地清除整个队列。

std::queue 似乎非常适合这样做,但不幸的是它缺少清除容器的功能。

所以在这一点上,我们有 2 个备选方案:

std::queue

  • 我们向 STL 库询问了我们需要什么。当然,STL 库会给我们更多:它会给我们一个伪装成 std::queue
  • std::deque
  • 我们只得到了我们需要的一部分,即弹出前和后推但没有明确
  • 我们将不得不以某种方式“模拟”clear,而不是循环和弹出的幼稚方式

std::deque

  • 我们向 STL 库询问了我们需要什么
  • 我们得到了我们要求的东西,但我们得到的太多了:我们还得到了前推和后退

总的来说,我们收到的要么太少要么太多,从来都不是我们真正想要的。

这是让我吃惊的事情,当我试图提供与 std::queue 一起使用的清晰功能时,它是我对象的成员 var

struct message
{
};
struct consumer
{
    std::queue<message> _pending;

    void clear_ver_1()
    {
       auto will_be_deleted_when_out_of_scope = std::move(_pending);
    }

    void clear_ver_2()
    {
        std::queue<message> will_be_deleted_when_out_of_scope;
        _pending.swap(will_be_deleted_when_out_of_scope);
    }
};

我已经阅读了规范,但我不能确定 clear_ver_1 是否会使 _pending 处于有效但未指定 状态或不是。查看string example那里。

我很惊讶规范对这个主题如此含糊。我找错地方了吗?

谢谢大家!

更新

分配和清算之间似乎存在不可忽视的区别。在内部,queue 和 deque 几乎是一样的(一个正在使用另一个)

enter image description here

最佳答案

std::move的用法

std::move 不应该以这种方式使用。您应该只使用 std::move,好吧,当您不再使用某个对象时,将它移动到程序中的其他地方。如您所说,它随后处于有效但未指定的状态:

  • 有效,因为它完全可以安全销毁;
  • 未指定,因为您不应再访问该对象。

std::queuestd::deque

如果您只打算使用 FIFO 功能,我建议您使用 std::queue。它确实清楚地表明您将使用std::deque 作为 FIFO 数据结构 — 清晰度是 std::queue< 的唯一原因 首先存在。

清除std::queue

您可以将它分配给一个空的 std::queue,或者像您所做的那样,将它换成一个空的。

// ...

struct consumer
{
    std::queue<message> _pending;

    void clearQueue()
    {
        _pending = {};
    }
};

根据 DevSolar 编辑的评论

关于c++ - std::queue 和 std::deque 清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71694365/

相关文章:

c++,将任何类型(模板T)的数据打印到控制台

c++ - Oracle OCI C++ 库

c++ - 如何创建一个行为类似于消息框的 Qt 窗口?

c++ - 当 .so 尝试使用主可执行文件中的类时,dlopen() 给出未解析的符号错误。为什么?

c++ - 分布在 -DBL_MAX 和 DBL_MAX 之间的随机 double

c++ - std::list 提示缺少第二个模板参数(分配器)

c++ - 什么时候从列表中弹出的对象被销毁?

C++11 std::forward 一个指针

c++ - 如何在代码中使用eclipse项目变量

c++ - binary_search 与 std::pair 使用自定义运算符