Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数据结构的选择 我使用C++,比如说我想存储40个用户名,我只会使用数组。然而,如果我想存储40000个用户名,这在搜索速度方面还是个好主意吗?我应该使用哪种数据结构来提高速度?_C++_Data Structures_Stl - Fatal编程技术网

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

数据结构的选择 我使用C++,比如说我想存储40个用户名,我只会使用数组。然而,如果我想存储40000个用户名,这在搜索速度方面还是个好主意吗?我应该使用哪种数据结构来提高速度?,c++,data-structures,stl,C++,Data Structures,Stl,您需要指定插入和删除要求。是否需要在序列中的任意点删除和插入内容 另外,为什么要求按顺序搜索?您正在执行不适合哈希表查找的搜索吗 目前,我建议使用deque或列表。通常,最好选择一个具有接口的容器,该接口可以为您的算法提供最简单的实现,然后仅在性能不充分且替代方案提供必要的加速时才更改选择 vector有两个主要优点,即没有每个对象的内存开销,尽管向量会过度分配以防止频繁复制,并且对象是连续存储的,因此顺序访问往往很快。这些也是它的缺点。生长的矢量需要重新分配和复制,从矢量末端以外的任何位置插入

您需要指定插入和删除要求。是否需要在序列中的任意点删除和插入内容

另外,为什么要求按顺序搜索?您正在执行不适合哈希表查找的搜索吗

目前,我建议使用
deque
列表
。通常,最好选择一个具有接口的容器,该接口可以为您的算法提供最简单的实现,然后仅在性能不充分且替代方案提供必要的加速时才更改选择

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

列表
不需要连续存储,但列表节点的每个对象开销通常为两个指针(在大多数实现中)。这在非常小的对象列表中非常重要(例如,在指针列表中,每个节点的大小是数据项的3倍)。从列表的中间插入和删除是非常便宜的,而且列表节点一旦创建就不需要在内存中移动


deque
使用分块存储,因此与向量类似,每个对象的开销较低,但不需要整个容器上的连续存储,因此不存在碎片化内存空间的问题。对于集合来说,它通常是一个很好的选择,并且经常被忽略。

您需要指定插入和删除要求是什么。是否需要在序列中的任意点删除和插入内容

另外,为什么要求按顺序搜索?您正在执行不适合哈希表查找的搜索吗

目前,我建议使用
deque
列表
。通常,最好选择一个具有接口的容器,该接口可以为您的算法提供最简单的实现,然后仅在性能不充分且替代方案提供必要的加速时才更改选择

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

列表
不需要连续存储,但列表节点的每个对象开销通常为两个指针(在大多数实现中)。这在非常小的对象列表中非常重要(例如,在指针列表中,每个节点的大小是数据项的3倍)。从列表的中间插入和删除是非常便宜的,而且列表节点一旦创建就不需要在内存中移动


deque
使用分块存储,因此与向量类似,每个对象的开销较低,但不需要整个容器上的连续存储,因此不存在碎片化内存空间的问题。对于集合来说,它通常是一个很好的选择,并且经常被忽略。

std::vector和std::list似乎适合此任务。如果事先知道最大记录数,则可以使用数组。

std::vector和std::list似乎适合此任务。如果事先知道记录的最大数量,则可以使用数组。

如果只需要按顺序搜索和存储,则是合适的容器。


另外,这也是一个不错的选择。

如果您只需要按顺序搜索和存储,那么是合适的容器。


另外,这也是一个不错的选择。

根据经验,与
列表相比,更喜欢
向量
,或者,迪蒂禁止使用C型数组


填充向量后,确保使用算法对其进行了正确排序。然后可以使用或搜索特定记录。(使用
find
不需要排序)

根据经验,您更喜欢
vector
而不是
list
或者diety禁止使用C型数组


填充向量后,确保使用算法对其进行了正确排序。然后可以使用或搜索特定记录。(您不需要排序来认真使用
查找

除非您处于资源受限的环境中(嵌入式平台、手机或其他)。使用a,省去排序或搜索的工作量,让容器处理所有事情。这可能是一个排序的树结构,可能是平衡(例如红黑),这意味着您将获得良好的搜索性能。除非数据的大小接近一个或两个指针的大小,否则所选数据结构的内存开销是可忽略的。您的图形卡可能有更多的内存,您将使用这些内存来存储所需的数据

正如其他人所说,如果您不想使用
map
use
std::vector,那么使用vanilla数组几乎没有什么好的理由