如何将一个 std::queue 的内容附加到另一个

How to append the contents of one std::queue to another

我需要能够将一个 std::queue 的内容添加(附加)到另一个,最好使用与使用 std::deque::insert 大致相同的方式,但使用 std::vector?我更愿意继续使用 std::vectors,而不是主要重写以实现 std::deques.

与我之前在同一个项目中的一些帖子一样,就我必须使用一些遗留代码可以使用的内容而言,我的机动性有限。大部分限制都与速度有关。尽管如此,该论坛的成员还是提出了一些优雅而独特的解决方案;我希望找到另一个。

// This works...
std::deque<std::vector<uint8_t>> aaa;
std::deque<std::vector<uint8_t>> bbb;
aaa.insert(aaa.end(), bbb.begin(), bbb.end());

// This, of course, does not work...
std::queue<std::vector<uint8_t>> ccc;
std::queue<std::vector<uint8_t>> ddd;
ccc.insert(ccc.end(), ddd.begin(), ddd.end());

显然不会编译,因为 ccc 类型不支持插入 std::queue

一些重要的注意事项:永远不会出现使用的容器(队列、双端队列等)需要 FIFO 以外的任何东西的情况。此外,处理处理的队列量在每秒 80,000 到 100,000 个元素之间,通常很小,偶尔很大。

std::queue 是(默认情况下)std::deque 之上的适配器,并且专门设计用于删除与 FIFO 队列结构无关的操作。

插入一系列元素,特别是,不是为 FIFO 容器定义的东西,首先使用 std::queue 的全部原因是在逻辑上限制操作,而不是 FIFO 容器接口的一部分.

话虽如此,std::queue 公开了它用作受保护成员变量 C 的底层容器,因此解决此限制的一种方法是从 [=11= 继承自定义适配器] 并公开底层容器。

但是,这有点违背了初衷,也许您最好直接从 std::deque?

开始

我决定进行必要的修改以使用 std::deque。 std::deque 的问题在于它允许从后面移除并推到前面。出于这个原因,我们的安全最佳实践指南强烈建议使用 std::queue。但是我成功地提出了我的理由(把 Stack Overflow 扔到公共汽车下哈哈)。再次感谢大家!