我使用C ++,说我想存储40个用户名,我只想使用一个数组。但是,如果我想存储40000个用户名,这在搜索速度方面仍然是一个好主意吗?我应该使用哪种数据结构来提高速度?
答案 0 :(得分:7)
您需要指定插入和删除要求。是否需要删除并插入序列中的随机点?
另外,为什么需要按顺序搜索?您是否正在进行不适合哈希表查找的搜索?
目前我建议使用deque
或list
。通常最好选择一个带有接口的容器,为您的算法提供最简单的实现,然后只有在性能不足且备选方案提供必要的加速时才更改选择。
vector
有两个主要优点,没有每个对象的内存开销,尽管向量将过度分配以防止频繁复制并且对象被连续存储,因此顺序访问往往很快。这些也是它的缺点。不断增长的向量需要重新分配和复制,并且从向量末尾以外的任何位置插入和删除也需要复制。连续存储可能会对包含大量对象或大型对象的向量产生问题,因为即使只有轻微的内存碎片,也很难满足连续存储要求。
list
不需要连续存储,但列表节点通常具有两个指针的每对象开销(在大多数实现中)。这在非常小的对象列表中可能很重要(例如,在指针列表中,每个节点是数据项大小的3倍)。从列表中间插入和删除非常便宜,列表节点永远不需要在创建后移动到内存中。
deque
使用分块存储,因此它具有与向量类似的低每对象开销,但不需要在整个容器上连续存储,因此碎片内存空间不会出现同样的问题。它通常是收藏品的一个很好的选择,经常被忽视。
答案 1 :(得分:2)
根据经验,更喜欢vector
到list
或者,禁止使用C风格的数组。
填充矢量后,请确保使用sort
算法正确排序。然后,您可以使用find
,binary_search
或lower_bound
搜索特定记录。 (您无需排序使用find
。)
答案 2 :(得分:1)
严重的是,除非您处于资源受限的环境(嵌入式平台,电话或其他)。使用std::map
,省去了排序或搜索的工作,让容器处理所有事情。这可能是一个排序的树结构,可能是平衡的(例如红黑),这意味着你将获得良好的搜索性能。除非您的数据大小接近一个或两个指针的大小,否则您选择的任何数据结构的内存开销都是可以忽略的。 You Graphics Card可能有更多的内存,您将用于您想到的数据。
正如其他人所说,使用香草阵列的理由很少,如果您不想使用map
使用std::vector
或std::list
,具体取决于您是否需要插入/删除数据(=>列表)或不删除(=>向量)
还要考虑你是否真的需要内存中的所有数据,如何通过sqlite将它放到磁盘上。甚至可以使用sqlite进行内存访问。这完全取决于您对数据的需求。
答案 3 :(得分:0)
std :: vector和std :: list看起来很适合这个任务。如果您知道前端的最大记录数,则可以使用数组。
答案 4 :(得分:0)