【发布时间】:2015-09-10 07:48:43
【问题描述】:
元素遵循某个属性,其中每个元素通过某种复杂关系与其前一个元素相关(假设没有已知的简单公式可以找出第 i 个元素)我想计算这个系列中某个元素的值,我必须为此计算每个元素的值,并在此过程中遍历完整的元素列表。
我使用了一个数组,它可能导致了一些内存分配错误(SIGABRT)。 我使用了一个向量,同样的错误。可能是因为元素的数量很大并且它们是连续存储的。 然后我使用了一个列表,没有这样的错误,但它花费的时间超过了可接受的时间限制。
【问题讨论】:
-
您的描述中没有任何内容说明您需要存储整个序列(而不是计算它)的原因。如果您解释了原因,那么您可能会得到更好的答案。
-
一个列表实际上占用了更多内存,但不是连续的。尽管如此,在这个 64 位计算的时代,连续内存限制实际上已经消失了。您确实编译为 64 位,对吗?
-
“我使用了向量,同样的错误。” - 你是如何使用
vector的?如果您可以reserve()预先提供足够的容量,则可以避免潜在的代价高昂的调整大小,包括暂时需要大约 3 倍于当前元素使用的内存(其中 2/3 需要是连续的)。如果你不能合理地提前预留,那么松元瑶的建议就像deque分配更小的块。 -
您可以存储中间值并通过从最近的存储邻居计算来插入缺失的值。