列表和forward_list性能之间的区别?

Difference between list and forward_list performance?

本文关键字:之间 区别 性能 list forward 列表      更新时间:2023-10-16

与 c++11 一样,我们有两种类型的列表:

std::list<int> lst = { 1, 2, 3, 4, 5 };
std::forward_list<int> flst = { 5, 4, 3, 2, 1};

众所周知,该列表基于双向链表,forward_list基于单向链表。

我们应该如何决定使用哪一个?上述任何列表是否有任何性能优势?

我们应该

如何决定使用哪一个?

确定是否需要双向迭代。 如果正向迭代足够好,请使用std::forward_list,除非您需要支持早于 C++11 的C++版本,这些版本可能只有std::list

上述任何列表是否有任何性能优势?

std::forward_list消除了每个节点的指针(为数据缓存和内存子系统带来了所有附带的好处(,而std::list提供了恒定时间迭代器递减。

但实际上,这些容器都不像人们在上计算机科学学校时所认为的那样被广泛使用。 对于许多应用程序来说,std::vector的实际性能是优越的,并且其内存使用量始终较少。 需要列表的更苛刻的应用程序最好考虑侵入性列表,标准C++不提供。

除了 john-zwinck 所说的之外,如果您必须使用链表,请在做出决定时牢记以下几点:

std::forward_list由于其性质,没有在末尾运行的修饰符函数:

push_back、pop_back emplace_back

此外,std::forward_list不提供size成员功能,以便根据std::list提高效率。std::listsize函数给出恒定时间内的元素数 C++11。另一方面,它需要一些额外的存储空间用于内部计数器,这使得插入和移除效率略低。为了达到std::forward_list的大小,距离算法可以与begin()end()函数一起使用,但此操作需要线性时间。