C++标准队列和矢量性能

C++ Std queue and vector performance

本文关键字:性能 标准 队列 C++      更新时间:2023-10-16

我最近一直在使用图形,我正在研究从图形返回路径。路径需要作为 std 向量返回,其中包含首先具有起始节点的所有节点。

我一直在寻找两种选择:- 使用慢速矢量插入方法在矢量前面添加节点- 使用双端将节点添加到前面(push_front),这要快得多。然后使用 std::copy 将双节复制到向量

使用一种方法是否比另一种方法显着提高性能?

由于您要返回一条路径,因此您可能对其长度有一个上限。因此,您可以调用 create a vector ,调用reserve,稍后(如@user2079303所写)调用push_back以将顶点添加到路径。

const auto n = <graph_size>
std::vector<size_t> path;
path.reserve(n)
...
v.push_back(i); // Push whatever you want.

现在的问题是,至少从问题来看,v似乎处于相反的顺序。但是,您可以简单地调用std::reverse

std::reverse(std::begin(v), std::end(v));

因此,仅使用vector

  • 您正在分配单个数据结构而不是两个;此外,使用reserve将有一个内存分配。

  • 最后使用 reverse 只是取代了从二元到向量的copy的使用。

如果您

正在考虑将std::vector包装在std::queue中,那么std::queue会将元素推到向量的背面(快速方式)。

即使不是,因为std::vector是连续存储,即使您push_font(),它也有可能胜过std::deque,因为它与CPU缓存配合得很好,因为 缓存的速度很快。

但是,为什么不同时尝试两者并分析代码以查看哪个性能更好呢?