我需要能够将一个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个元素的队列量,通常很小,偶尔很大。
答案 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。但是我成功地提出了自己的建议(将堆栈溢出置于总线下)。再次感谢所有人!