为什么 deque 比队列快?
Why is deque faster than queue?
我有以下工作代码(g++ 8.2,C++17标准。
queue<TreeNode*> q{};
q.push(root);
q.push(nullptr);
int sum = root -> val;
while (!q.empty()) {
TreeNode *n = q.front();
q.pop();
if (n != nullptr) {
sum += n->val;
if (n-> left != nullptr) q.push(n->left);
if (n-> right != nullptr) q.push(n->right);
} else {
if (q.empty()) break;
q.push(nullptr);
sum = 0;
}
}
return sum;
然后我用deque<TreeNode*>
替换了queue<TreeNode*>
.事实证明,速度至少提高了 20%。为什么deque<TreeNode*>
比queue<TreeNode*>
快得多?
从 cppreference.com: std::queue
template<
class T,
class Container = std::deque<T>
> class queue;
Container
- 用于存储元素的基础容器的类型。
因此,默认情况下,std::queue
使用std::deque
作为其内部容器,因为它最多只能与std::deque
(或一般的底层容器(一样快,并且因为作为包装器,它 - 取决于编译器可以做的优化 - 更慢。因此,如果您正确测量了 20% 的减速,那么您就可以衡量编译器在给定优化级别优化包装器代码方面有多好。
由于存在std::queue
以保证FIFO的使用,因此仅通过公开这些功能,我怀疑 - 但我现在无法对其进行测试 - 打开优化后速度会如此之慢。如果是,我会认为这是编译器或库实现功能的错误/缺陷。
相关文章:
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- Capacity of a deque
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- C++ deque 消费者总是从生产者那里得到空队列
- 为什么 deque 比队列快?
- Deque vs队列速度
- 自定义deque(双端队列)类
- STL队列(OR堆栈)的deque和链表(+vector)实现之间有什么区别
- 自定义分配器可用于vector,但不能用于deque(封装在队列中)
- 当队列不为空时,在 queue.front() 处"deque iterator not dereferencable"