为什么 deque 比队列快?

Why is deque faster than queue?

本文关键字:队列 deque 为什么      更新时间:2023-10-16

我有以下工作代码(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的使用,因此仅通过公开这些功能,我怀疑 - 但我现在无法对其进行测试 - 打开优化后速度会如此之慢。如果是,我会认为这是编译器或库实现功能的错误/缺陷。