C ++ Std队列和矢量性能

时间:2016-02-24 07:21:22

标签: c++ algorithm vector std deque

我最近一直在使用图表,我正在寻找从图表中返回路径的方法。该路径需要作为std向量返回,该向量包含首先具有起始节点的所有节点。

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

将双端队列复制到向量

使用一种方法比另一种方法有显着的性能提升吗?

2 个答案:

答案 0 :(得分:2)

由于您正在返回路径,因此您可能在其长度上有一个上限。因此,您可以调用创建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只会取代您从deque到vector的copy的使用。

答案 1 :(得分:1)

如果您正在考虑将std::vector包裹在std::queue中,则std::queue会将元素推送到向量的后面(快速方式)

即使不是,因为std::vector是连续存储,即使您std::deque,它也有可能胜过push_font(),因为它与{{1}匹配良好缓存数据快速的缓存。

但为什么不尝试两种方法并对代码进行分析以确定哪种代码表现更好?