C++标准队列和矢量性能
C++ Std queue and vector performance
我最近一直在使用图形,我正在研究从图形返回路径。路径需要作为 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
缓存配合得很好,因为 缓存的速度很快。
但是,为什么不同时尝试两者并分析代码以查看哪个性能更好呢?
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 递归列出所有目录中的C++与Python与Ruby的性能
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 标准库容器最简单、性能差的哈希类是什么?
- 不同机器之间的标准时钟性能差异显著
- 标准::矢量的 4 维性能
- 如何在C++中提高标准::set_intersection性能
- 标准堆栈性能问题
- 标准::副本部分标准::矢量的性能
- C++标准队列和矢量性能
- 从标准输出读取奇怪的性能问题
- 性能标准::strstr vs. 标准::字符串::查找
- std::映射标准分配器性能与块分配器
- 由于标准容器中元素的默认初始化而导致性能下降
- 哪个性能更好?标准::数组或 C 数组