我在Effective STL中注意到,
vector
是默认应该使用的序列类型。
这是什么意思?似乎忽略效率,vector
都可以胜任任何工作。
请问有没有一种场景,vector
不是可行选项而必须使用list
的情况?
我在Effective STL中注意到,
vector
是默认应该使用的序列类型。
这是什么意思?似乎忽略效率,vector
都可以胜任任何工作。
请问有没有一种场景,vector
不是可行选项而必须使用list
的情况?
将答案总结成表格以便快速参考:
向量 | 列表 | |
---|---|---|
访问 | 更快 | 较慢 |
插入/删除操作 | 较慢 | 更快 |
内存分配 | 连续的 | 非连续的 |
预先分配空间大小 | 需要保留 | 不需要保留 |
每个元素所需空间 | 仅为元素本身 | 包括指向下一个(和可选的前一个)元素的指针 |
保持迭代器的有效性是使用列表的原因之一。另一个原因是当您不希望向向量推送项时重新分配内存。这可以通过智能使用reserve()来管理,但在某些情况下,仅使用列表可能更容易或更可行。
list::splice
。splice
(现在)需要迭代整个序列以计算其中元素的数量。(因为列表需要记录其大小。)仅计数并重新链接列表仍然比任何其他替代方案更快,并且拼接整个列表或单个元素是具有常量复杂度的特殊情况。但是,如果您需要拼接长序列,则可能需要寻找更好的、老式的、非兼容的容器。list
的硬性规定是在需要分配容器元素的指针时。与vector
不同,您知道元素的内存不会被重新分配。如果可能会重新分配,则可能存在对未使用内存的指针,这最多是一个大忌,最坏的情况下是一个SEGFAULT
。*_ptr
的vector
也可以工作,但在这种情况下,您正在模拟list
,因此这只是语义上的问题。)list
更可取。列表只是STL中双向链表的包装器,因此提供了您可能从D-Linklist中期望的功能,即O(1)插入和删除。而向量是一种连续的数据序列,类似于动态数组。P.S-更容易遍历。
列表是双向链表,因此插入和删除元素很容易。我们只需要改变一些指针,而在向量中,如果我们想在中间插入一个元素,则其后的每个元素都必须向右移动一个索引。此外,如果向量的大小已满,则必须先增加其大小。因此,这是一项昂贵的操作。 因此,在需要更频繁执行插入和删除操作的情况下,应使用列表。