列表和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基于单向链表。
我们应该如何决定使用哪一个?上述任何列表是否有任何性能优势?
我们应该
如何决定使用哪一个?
确定是否需要双向迭代。 如果正向迭代足够好,请使用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::list
的size
函数给出恒定时间内的元素数 C++11。另一方面,它需要一些额外的存储空间用于内部计数器,这使得插入和移除效率略低。为了达到std::forward_list
的大小,距离算法可以与begin()
和end()
函数一起使用,但此操作需要线性时间。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?