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

时间:2019-07-12 15:51:47

标签: c++ stdvector stddeque

我需要能够将一个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不支持insert

一些重要的注意事项:永远不会发生正在使用的容器(队列,双端队列等)不需要FIFO的情况。而且,该处理每秒处理80,000到100,000个元素的队列量,通常很小,偶尔很大。

2 个答案:

答案 0 :(得分:4)

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

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

话虽如此,std::queue公开了它用作受保护的成员变量C的基础容器,因此解决此限制的一种方法是从std::deque继承自定义适配器,然后暴露底层容器。

但是,这在一定程度上违背了目标,也许您最好直接从std::deque开始?

答案 1 :(得分:0)

我决定进行必要的修改以使用std :: deque。 std :: deque的问题在于它允许从背面移除并推到正面。正是出于这个原因,我们的安全性和最佳实践准则强烈建议使用std :: queue。但是我成功地提出了自己的建议(将堆栈溢出置于总线下)。再次感谢所有人!