列表和 forward_list 性能之间的区别?
Difference between list and forward_list performance?
与 c++11 一样,我们有两种类型的列表:
std::list<int> lst = { 1, 2, 3, 4, 5 };
std::forward_list<int> flst = { 5, 4, 3, 2, 1};
众所周知,链表是基于双向链表的,forward_list是基于单向链表的。
我们应该如何决定使用哪一个?以上任何列表是否有任何性能优势?
How should we decide which one to used?
决定是否需要双向迭代。如果正向迭代足够好,就用std::forward_list
,除非你需要支持早于C++11的C++版本,可能只有std::list
.
Is there any performance benefit of any of the list above other?
std::forward_list
消除了每个节点的指针(具有数据缓存和内存子系统的所有附带好处),而 std::list
提供恒定时间迭代器递减。
但实际上,这两种容器都没有像人们在上计算机科学学校时所相信的那样广泛使用。 std::vector
的实际性能对于许多应用程序来说是优越的,而且它的内存使用量总是较少。需要列表的要求更高的应用程序最好考虑标准 C++ 不提供的侵入式列表。
除了john-zwinck所说的之外,如果您必须使用链表,请在做出决定时记住以下几点:
std::forward_list
由于其性质,最后没有修饰符函数:
push_back, pop_back, emplace_back
此外,std::forward_list
没有根据 std::list
提供 size
成员函数以提高效率。 std::list
的 size
函数给出了 C++11 常数时间内的元素数量。另一方面,它需要一些额外的内部计数器存储空间,这使得插入和移除的效率稍低。为了达到 std::forward_list
的大小,距离算法可以与 begin()
和 end()
函数一起使用,但此操作需要线性时间。
与 c++11 一样,我们有两种类型的列表:
std::list<int> lst = { 1, 2, 3, 4, 5 };
std::forward_list<int> flst = { 5, 4, 3, 2, 1};
众所周知,链表是基于双向链表的,forward_list是基于单向链表的。
我们应该如何决定使用哪一个?以上任何列表是否有任何性能优势?
How should we decide which one to used?
决定是否需要双向迭代。如果正向迭代足够好,就用std::forward_list
,除非你需要支持早于C++11的C++版本,可能只有std::list
.
Is there any performance benefit of any of the list above other?
std::forward_list
消除了每个节点的指针(具有数据缓存和内存子系统的所有附带好处),而 std::list
提供恒定时间迭代器递减。
但实际上,这两种容器都没有像人们在上计算机科学学校时所相信的那样广泛使用。 std::vector
的实际性能对于许多应用程序来说是优越的,而且它的内存使用量总是较少。需要列表的要求更高的应用程序最好考虑标准 C++ 不提供的侵入式列表。
除了john-zwinck所说的之外,如果您必须使用链表,请在做出决定时记住以下几点:
std::forward_list
由于其性质,最后没有修饰符函数:
push_back, pop_back, emplace_back
此外,std::forward_list
没有根据 std::list
提供 size
成员函数以提高效率。 std::list
的 size
函数给出了 C++11 常数时间内的元素数量。另一方面,它需要一些额外的内部计数器存储空间,这使得插入和移除的效率稍低。为了达到 std::forward_list
的大小,距离算法可以与 begin()
和 end()
函数一起使用,但此操作需要线性时间。