Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在矢量上滑动的好处?_C++_List_Stl_Vector - Fatal编程技术网

C++ 在矢量上滑动的好处?

C++ 在矢量上滑动的好处?,c++,list,stl,vector,C++,List,Stl,Vector,我需要的只是一个动态增长的数组。我不需要随机访问,我总是插入到结尾,并从头到尾阅读 slist似乎是第一选择,因为它提供了我所需要的东西。然而,我不知道使用slist而不是vector有什么好处。此外,我读到的一些关于STL的材料说,“向量通常是访问元素以及在序列末尾添加或删除元素的最有效的时间”。因此,我的问题是:对于我的需求,slist真的比vector更好吗?提前谢谢。是的,如果你总是从头到尾地阅读,(一个链接列表)听起来像是一种方法。可能的例外情况是,如果同时在末尾插入大量元素。那么,如

我需要的只是一个动态增长的数组。我不需要随机访问,我总是插入到结尾,并从头到尾阅读


slist似乎是第一选择,因为它提供了我所需要的东西。然而,我不知道使用slist而不是vector有什么好处。此外,我读到的一些关于STL的材料说,“向量通常是访问元素以及在序列末尾添加或删除元素的最有效的时间”。因此,我的问题是:对于我的需求,slist真的比vector更好吗?提前谢谢。

是的,如果你总是从头到尾地阅读,(一个链接列表)听起来像是一种方法。可能的例外情况是,如果同时在末尾插入大量元素。那么,如果你适当地使用reserve,向量可能会更好


当然,配置文件以确保它更适合您的应用程序。

对于初学者来说,
slist
是非标准的

对于您的选择,链接列表将比向量慢,请放心。这有两个原因:

  • 首先,缓存局部性;向量将其元素线性存储在RAM中,这有助于缓存和预取
  • 其次,添加到链表涉及动态分配,这会增加大量开销。相比之下,向量在大多数情况下不需要分配内存

  • 但是,std::deque可能会更快。研究表明,尽管存在相反的偏见,
    std::deque
    在性能上几乎总是优于
    std::vector
    (如果不需要随机访问),这是因为它改进了(分块)内存分配策略。

    我猜你是指std::list的“slist”。当您需要快速、随机地访问元素序列、保证连续内存和快速顺序读取(从开始到结束)时,向量是很好的。当您需要在序列的开头或结尾快速(固定时间)插入或删除项目时,列表是很好的,但不关心随机访问或顺序读取的性能

    产生差异的原因在于2的实现方式。向量在内部实现为项目数组,当添加项目时达到其大小/容量时,需要重新分配该数组。列表实现为双链接列表,这可能会导致顺序读取的缓存未命中。列表的随机访问也需要从列表中的第一个(或最后一个)项扫描,直到它找到您要的项目。

    < P> Matt Austern(作者:“泛型编程和STL”和通用C++ Guru)是单链表的强倡导者,以包含在即将到来的C++标准中;有关更多详细信息,请参见他的演示文稿和他的长篇文章,包括对可能指导您选择此数据结构的权衡的讨论。(请注意,目前建议的名称是
    forward\u list
    ,尽管
    slist
    是SGI的STL和其他流行库中传统的名称)。

    我将支持(或可能是第三个…)以下观点:
    std::vector
    std::deque
    。我要添加的唯一一件事是一些额外的因素,它们应该指导
    std::vector
    std::list
    之间的决策。这些与
    T
    的特性以及您计划使用的算法有很大关系

    首先是内存开销<代码> STD::清单是一个基于节点的容器,因此如果<代码> T < /C>是一个原始类型或相对较小的用户定义类型,那么基于节点的链接的内存开销可能是不可忽略的——考虑<代码> STD::List很可能使用至少<代码> 3×sieof(int)每个元素的存储,而
    std::vector
    只使用
    sizeof(int)
    存储,头开销很小
    Std::deque
    类似于
    Std::vector
    ,但开销较小,与
    N
    成线性关系

    下一个问题是拷贝构建的成本。如果
    T(T const&)
    非常昂贵,那么请避免使用
    std::vector
    ,因为它会随着向量大小的增加而产生大量副本。这就是为什么
    std::deque
    是一个明显的赢家,而
    std::list
    也是一个竞争者


    通常指导容器类型决策的最后一个问题是,您的算法是否能够处理
    std::vector
    std::deque
    的迭代器无效约束。如果您将大量操作容器元素(例如,排序、插入中间或改组),那么您可能倾向于“代码> STD::列表< /COD>”,因为操作命令只需要重置几个链接指针。

    听起来像是STD的好工作::对我来说。它的内存优势是为每个“slab”分配类似向量的连续内存(适用于CPU缓存),不像std::list那样为每个元素分配开销,并且不需要像std::vector那样重新分配整个集合。阅读更多关于

    的信息,这听起来与我所写的内容(并备份了数据)相反,因此可能不正确。您没有提供任何关于slist的数据,只是提供了它的模糊承诺,以及对其他两种(除了slist)结构的比较。再次:抱歉。我有点愚蠢,我混淆了基准。注意SLIST是SGI STL分布的一部分,但不是C++标准库的一部分。在C++ C++ 0x/c++ 1x(下一个C++版本)中有一个STD::TyrdJo.list。谢谢,我刚才也学到了。STL:STL中还有一个列表类。什么让你认为Slist会慢一些,这个神秘的(适用于所有应用程序)的性能评估在哪里?说,“deque与vector的主要区别在于deque a