gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:24:04 34 4
gpt4 key购买 nike

假设我们有一种情况需要 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com