假设我们有一种情况需要 FIFO 数据结构。例如,按事件进来的顺序消费一些事件。
此外,我们需要不时地清除整个队列。
std::queue
似乎非常适合这样做,但不幸的是它缺少清除容器的功能。
所以在这一点上,我们有 2 个备选方案:
std::queue
- 我们向 STL 库询问了我们需要什么。当然,STL 库会给我们更多:它会给我们一个伪装成
std::queue
的 - 我们只得到了我们需要的一部分,即弹出前和后推但没有明确
- 我们将不得不以某种方式“模拟”clear,而不是循环和弹出的幼稚方式
std::deque
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 几乎是一样的(一个正在使用另一个)
最佳答案
std::move
的用法
std::move
不应该以这种方式使用。您应该只使用 std::move
,好吧,当您不再使用某个对象时,将它移动到程序中的其他地方。如您所说,它随后处于有效但未指定的状态:
- 有效,因为它完全可以安全销毁;
- 未指定,因为您不应再访问该对象。
std::queue
与 std::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/