何时使用C ++ forward_list

时间:2014-08-24 14:04:56

标签: c++ stl containers forward-list

我是C ++的新手,并且正在阅读“C ++编程语言”(第4版)"这本书。在阅读" STL容器"的章节时,本书介绍了forward_list:

  

forward_list(单链表)基本上是优化的列表   对于空的和非常短的列表。一个空的forward_list只占用   一个词。令人惊讶的是,大多数用于列表的用途很多   空的(剩下的很短)。

我想知道一个名单短暂的考虑有多短?有没有人可以举一个简单的例子来利用forward_list?

1 个答案:

答案 0 :(得分:10)

一般来说,当您担心存储大小时,您希望使用类似转发列表的内容而不是随机访问迭代。 这是一种可用于存储各种稀疏数据的数据结构。如果您有大量的条目是某些默认值,那么假设所有条目都是默认值,除非明确指出它们不是默认值,否则会更便宜(就内存而言)。

我上次使用forward_list代表sparse matrix并列出了列表方法。这节省了大量内存,因为只有非常少量的条目非零,并且矩阵的维数非常大。

假设您有一个包含大量顶点但没有大量边缘的图形,可能有数百万个顶点(节点),但每个顶点最多只有5个边(连接)。如果您尝试使用邻接矩阵(多维数组)将此图存储在内存中,则存储的大小将为O(|v|^2)(其中v是顶点集)。如果将其存储为一个数组,该数组是包含每个顶点的边列表的顶点的长度,那么大小将为O(|v|*|e|)(其中e是边的集合)。如果边缘比顶点少得多,这就是许多图形的情况,那么采用边缘列表方法可能是一个不错的选择。在上面提到的这种情况下,|e|最多为5,因此节省的内存是巨大的。通常,当您找到感兴趣的顶点时,在开始对其执行操作之前,将与其关联的边加载到内存中。在这种情况下,这个想法主要是关于存储而不是随机访问迭代,所以如果你不使用它们,你不想要支付大量的指针。对于此forward_list,将使用适当的数据结构。