选择数据结构

时间:2009-07-05 10:35:55

标签: c++ data-structures stl

我使用C ++,说我想存储40个用户名,我只想使用一个数组。但是,如果我想存储40000个用户名,这在搜索速度方面仍然是一个好主意吗?我应该使用哪种数据结构来提高速度?

5 个答案:

答案 0 :(得分:7)

您需要指定插入和删除要求。是否需要删除并插入序列中的随机点?

另外,为什么需要按顺序搜索?您是否正在进行不适合哈希表查找的搜索?

目前我建议使用dequelist。通常最好选择一个带有接口的容器,为您的算法提供最简单的实现,然后只有在性能不足且备选方案提供必要的加速时才更改选择。

vector有两个主要优点,没有每个对象的内存开销,尽管向量将过度分配以防止频繁复制并且对象被连续存储,因此顺序访问往往很快。这些也是它的缺点。不断增长的向量需要重新分配和复制,并且从向量末尾以外的任何位置插入和删除也需要复制。连续存储可能会对包含大量对象或大型对象的向量产生问题,因为即使只有轻微的内存碎片,也很难满足连续存储要求。

list不需要连续存储,但列表节点通常具有两个指针的每对象开销(在大多数实现中)。这在非常小的对象列表中可能很重要(例如,在指针列表中,每个节点是数据项大小的3倍)。从列表中间插入和删除非常便宜,列表节点永远不需要在创建后移动到内存中。

deque使用分块存储,因此它具有与向量类似的低每对象开销,但不需要在整个容器上连续存储,因此碎片内存空间不会出现同样的问题。它通常是收藏品的一个很好的选择,经常被忽视。

答案 1 :(得分:2)

根据经验,更喜欢vectorlist或者,禁止使用C风格的数组。

填充矢量后,请确保使用sort算法正确排序。然后,您可以使用findbinary_searchlower_bound搜索特定记录。 (您无需排序使用find。)

答案 2 :(得分:1)

严重的是,除非您处于资源受限的环境(嵌入式平台,电话或其他)。使用std::map,省去了排序或搜索的工作,让容器处理所有事情。这可能是一个排序的树结构,可能是平衡的(例如红黑),这意味着你将获得良好的搜索性能。除非您的数据大小接近一个或两个指针的大小,否则您选择的任何数据结构的内存开销都是可以忽略的。 You Graphics Card可能有更多的内存,您将用于您想到的数据。

正如其他人所说,使用香草阵列的理由很少,如果您不想使用map使用std::vectorstd::list,具体取决于您是否需要插入/删除数据(=>列表)或不删除(=>向量)

还要考虑你是否真的需要内存中的所有数据,如何通过sqlite将它放到磁盘上。甚至可以使用sqlite进行内存访问。这完全取决于您对数据的需求。

答案 3 :(得分:0)

std :: vector和std :: list看起来很适合这个任务。如果您知道前端的最大记录数,则可以使用数组。

答案 4 :(得分:0)

如果您只需要按顺序搜索和存储,则list是正确的容器
此外,vector也不是一个糟糕的选择。