C++ C++;Std队列与向量性能

C++ C++;Std队列与向量性能,c++,algorithm,vector,std,deque,C++,Algorithm,Vector,Std,Deque,我最近一直在处理图形,我正在研究从图形返回路径。路径需要作为std向量返回,该向量包含所有先开始节点的节点 我一直在考虑两种选择: -使用慢速向量插入方法在向量前面添加节点 -使用deque将节点添加到前端(push_front),这要快得多。然后使用std::copy将deque复制到向量 使用一种方法比使用另一种方法是否有显著的性能提升?因为您返回的是路径,所以它的长度可能有一个上限。因此,您可以调用create avector、call和更高版本(如@user207933所写)来向路径添加

我最近一直在处理图形,我正在研究从图形返回路径。路径需要作为std向量返回,该向量包含所有先开始节点的节点

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


使用一种方法比使用另一种方法是否有显著的性能提升?

因为您返回的是路径,所以它的长度可能有一个上限。因此,您可以调用create a
vector
、call和更高版本(如@user207933所写)来向路径添加顶点

const auto n = <graph_size>
std::vector<size_t> path;
path.reserve(n)
...
v.push_back(i); // Push whatever you want.
因此,仅使用
向量

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

  • 最后使用的
    reverse
    简单地取代了从deque到向量的
    copy


如果要在
std::queue
中包装
std::vector
,则
std::queue
会将元素推到向量的后面(快速方式)

然而,即使不是这样,因为
std::vector
是连续存储,所以即使您
push_font()
,它也有可能比
std::deque
执行得更好,因为它能很好地与数据快速混洗的
CPU
缓存配合使用


但是,为什么不尝试这两种方法并分析代码,看看哪一种性能更好?

为什么不推到向量的后面呢?如果不需要直接访问元素,我建议使用链表。我认为你应该关注可以找到路径的主要算法,而不是选择不太重要的数据结构,因为向量和出列都是O(n)。另外,你认为std::copy不会占用时间和空间吗?@Kilanny如果不知道确切的使用模式,这很难推荐。由于缓存位置不佳,列表的迭代时间比连续存储数据类型(如
vector
)慢。您可以在标题中说
queue
,在正文中说
deque
。是哪一个?这两个都是标准库中的内容。如果您记得使用
vector.rbegin()
vector.rend()
以相反的方式迭代返回值,则无需使用
std::reverse()
。如果我知道容器的组织方式是“错误的”,我发现反向迭代器非常方便@哈维:这是一个很好的观点——如果可能的话,你也可以推翻“惯例”。
std::reverse(std::begin(v), std::end(v));