Jon*_*vis 382
向量:
列表:
一般情况下,当你不关心你正在使用什么类型的顺序容器时使用vector,但是如果你在容器中的任何地方进行多次插入或擦除,那么你将需要使用清单.或者,如果您需要随机访问,那么您将需要向量,而不是列表.除此之外,根据您的应用程序,您自然会需要一个或另一个,但总的来说,这些都是很好的指导方针.
Mar*_*ork 88
您希望将大量项目重复插入序列末尾的情况.
查看每种不同类型容器的复杂性保证:
Han*_*ant 30
如果您不需要经常插入元素,那么向量将更有效.它具有比列表更好的CPU缓存局部性.换句话说,访问一个元素使得下一个元素很可能存在于缓存中,并且可以在不必读取慢速RAM的情况下进行检索.
Tom*_*dor 28
这里的大多数答案错过了一个重要细节:为什么?
你想把什么保留在容器中?
如果它是ints 的集合,那么std::list在每个场景中都会丢失,无论你是否可以重新分配,你只能从前面删除等等.列表遍历较慢,每次插入都会花费你与分配器的交互.准备一个list<int>节拍的例子是非常困难的vector<int>.即便如此,deque<int>可能会更好或更接近,而不仅仅是使用列表,这会产生更大的内存开销.
但是,如果你正在处理大而丑陋的数据 - 而且很少 - 你不想在插入时进行全面分配,并且由于重新分配而进行复制将是一场灾难 - 那么你可能会更好地使用list<UglyBlob>比vector<UglyBlob>.
尽管如此,如果你再次切换到vector<UglyBlob*>甚至是vector<shared_ptr<UglyBlob> >- 列表将落后.
因此,访问模式,目标元素数量等仍会影响比较,但在我看来 - 元素大小 - 复制成本等.
Unc*_*ens 16
std :: list的一个特殊功能是拼接(将一部分或整个列表链接或移动到不同的列表中).
或者,如果您的内容复制起来非常昂贵.在这种情况下,例如,使用列表对集合进行排序可能更便宜.
另请注意,如果集合很小(内容复制起来不是特别昂贵),即使您在任何地方插入和删除,矢量仍可能优于列表.列表单独分配每个节点,这可能比移动一些简单的对象要昂贵得多.
我认为没有非常严格的规则.这取决于你最想要对容器做什么,以及你期望容器的大小和包含的类型.向量通常胜过列表,因为它将其内容分配为单个连续块(它基本上是动态分配的数组,在大多数情况下,数组是保存一堆内容的最有效方法).
xyz*_*xyz 14
让它变得简单-
在一天结束时,当您在 C++ 中选择容器感到困惑时,请使用此流程图图像(感谢我):-
向量-
列表-
jok*_*oon 13
好吧,我班上的学生似乎无法向我解释何时使用向量更有效,但在建议我使用列表时他们看起来很开心.
这就是我理解它的方式
列表:每个项目都包含下一个或上一个元素的地址,因此使用此功能,您可以随机化项目,即使它们未排序,顺序也不会更改:如果内存碎片化,则效率很高.但它还有另一个非常大的优势:您可以轻松插入/删除项目,因为您唯一需要做的就是更改一些指针.缺点:要读取随机单个项目,您必须从一个项目跳到另一个项目,直到找到正确的地址.
向量:当使用向量时,内存比常规数组更有条理:每个第n项存储在第(n-1)项之后和第(n + 1)项之前.为什么它比列表更好?因为它允许快速随机访问.方法如下:如果您知道向量中项目的大小,并且它们在内存中是连续的,则可以轻松预测第n个项目的位置; 你不必浏览列表中的所有项目来阅读你想要的那个项目,使用矢量,你可以直接阅读它,但你不能使用列表.另一方面,修改矢量数组或更改值要慢得多.
列表更适合跟踪可在内存中添加/删除的对象.当您想要从大量单个项目中访问元素时,向量更合适.
我不知道如何优化列表,但你必须知道如果你想要快速读取访问,你应该使用向量,因为STL紧固列表有多好,它在读取访问中的速度不会高于向量.
将答案总结在表格中以供快速参考:
| 向量 | 列表 | |
|---|---|---|
| 使用权 | 快点 | 慢点 |
| 插入/删除操作 | 慢点 | 快点 |
| 内存分配 | 连续的 | 不连续 |
| 尺寸预分配 | 需要预约 | 无需预约 |
| 每个元素所需的空间 | 仅适用于元素本身 | 对于元素和指向下一个元素 (以及可选的前一个元素)的指针 |
就向量和列表而言,我注意到的主要区别如下:
向量
向量将其元素存储在连续的内存中。因此,向量内部可以进行随机访问,这意味着访问向量的元素非常快,因为我们只需将基地址与项索引相乘即可访问该元素。事实上,为此目的只需要 O(1) 或常数时间。
由于向量基本上包装了一个数组,因此每次将元素插入向量(动态数组)时,它都必须通过查找新的连续内存块来调整自身大小以容纳新元素,这是非常耗时的。
它不会消耗额外的内存来存储指向其中其他元素的任何指针。
列表
列表将其元素存储在非连续内存中。因此,在列表内部不可能进行随机访问,这意味着要访问其元素,我们必须使用指针并遍历列表,这相对于向量来说速度较慢。这需要 O(n) 或比 O(1) 慢的线性时间。
由于列表使用非连续内存,因此在列表中插入元素所花费的时间比其向量对应项的情况要高效得多,因为避免了内存的重新分配。
它消耗额外的内存来存储指向特定元素之前和之后的元素的指针。
因此,记住这些差异,我们通常会考虑内存、频繁的随机访问和插入来决定给定场景中向量与列表的获胜者。
| 归档时间: |
|
| 查看次数: |
273277 次 |
| 最近记录: |