Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 加快地图速度的最快方法<;字符串,int>。在c++。钥匙是按字母顺序排列的_C++_Map - Fatal编程技术网

C++ 加快地图速度的最快方法<;字符串,int>。在c++。钥匙是按字母顺序排列的

C++ 加快地图速度的最快方法<;字符串,int>。在c++。钥匙是按字母顺序排列的,c++,map,C++,Map,我有一张大约100000双的地图。如果键是按字母顺序排列的,那么在使用find()时是否有任何方法可以加快搜索速度。还有,我该怎么做呢。我知道你可以在创建地图时指定一个新的比较器。但是这会加快find()函数的速度吗 提前谢谢 [已解决]感谢一群家伙,我决定使用向量,并使用上下限来“剪断”一些搜索 另外,我是新来的。有没有办法将这个问题标记为已回答,或者选择一个最佳答案?std::map已经利用了键按字母顺序排列的事实,它保证了这一点。您无法通过更改比较器来改进它(假设它已经是一个相当有效的字符

我有一张大约100000双的地图。如果键是按字母顺序排列的,那么在使用find()时是否有任何方法可以加快搜索速度。还有,我该怎么做呢。我知道你可以在创建地图时指定一个新的比较器。但是这会加快find()函数的速度吗

提前谢谢

[已解决]感谢一群家伙,我决定使用向量,并使用上下限来“剪断”一些搜索


另外,我是新来的。有没有办法将这个问题标记为已回答,或者选择一个最佳答案?

std::map
已经利用了键按字母顺序排列的事实,它保证了这一点。您无法通过更改比较器来改进它(假设它已经是一个相当有效的字符串比较)

您是否考虑过在C++11之前的各种实现中使用
unordered_map
(aka
hash_map
)?它应该能够在O(1)中而不是O(log(n))中搜索
std::map


你也可以研究一些更奇特的东西,比如trie,但这不是标准库的一部分,所以你要么在别处找到一个,要么自己动手,所以我建议
unordered\u map
是一个很好的起点。

如果一个不同的比较器能够更快地进行比较,那么它只能加快查找速度(对于字符串来说,这通常是相当困难的)

如果基本上是按顺序插入所有数据,然后进行搜索,那么使用
std::vector
std::lower_bound
std::upper_bound
可能会更快

如果您并不真正关心排序,只想尽快找到数据,您可能会发现
std::unordered_map
更适合您


编辑:仅供记录:您“可能找到”或“可能找到”这些东西的方式通常是通过分析。根据情况,分析速度可能足够快,即使在简单的测试中也很明显,因此分析不是真的必要,但如果有(很多)怀疑,或者你想量化效果,探查器可能是正确的方法。

我投票支持
无序地图
,但我想提出另一点

在现代机器上,影响性能的一个因素是缓存使用不当。映射将在所有位置分配节点,并且没有太多的引用位置。此外,由于它必须在节点之间存储一组指针,因此会占用更多内存

在最近的一次会议上,比亚恩·斯特劳斯特鲁(Bjarne Stroustroup)给出了一个关于这个主题的演讲。他比较了
vector
list
在一项涉及大量随机插入和删除的任务中的性能,在这项任务中,似乎
list
应该占主导地位,但由于内存大小和布局问题,
vector
被我忽略了事实上是目前为止最快的。请看,从幻灯片43开始


unordered\u map
允许您直接访问元素,因此它可能意味着在内存中跳跃的次数比尝试将数据粘贴到
向量中的次数更少(因此性能优于
向量
)因此,我的评论只是一个警告,要时刻牢记内存访问模式以提高性能

如果您使用
std::find
查找元素,您应该切换到使用
map::find
(您的问题中并没有真正的说明)。
map::find
使用这样一个事实,即映射的顺序是为了更快地搜索


如果这还不够好,您可以查看散列容器,例如
unordered_-map
,而不是
map
,如果您的编译器支持它,请尝试
std::unordered_-map
。另外,按字母顺序排列键并不重要,
map
无论如何都会将它们重新排列为字母顺序。@MarkRansom:就因为我不同意:这取决于比较器:d要将问题标记为已回答,你可以在答案的左侧,投票按钮下面用勾号选择一个最佳答案。关于排序的
std::vector
,请参阅“s”,以获得一个预写、预测试的实现。@JerryCoffin:我删除了下一票。我删除了下一票有一种令人不快的倾向。这是一个很好的观点。问题真的没有弄清楚。使用
std::find
基本上是搜索的最坏情况,无论是在算法上还是在内存访问模式方面。实际上,如果用于
std::find
的比较器与用于映射或是的,无法
std::find
专门使用member
find
?@bames53否,因为
std::find
无法通过或不知道容器是什么。它只是进行线性搜索。@bames53:可以,但不需要,而且我从未见过实现这样做,因为它远比听起来难。@MarkB这是有道理的。尽管我认为如果迭代器提供对容器的访问(就像调试迭代器用于有效性检查)就可以做到这一点。显然,依赖一个实现来实现这一点是不好的,因此首先不值得实现,除非是出于好奇。我喜欢他在演讲期间绘制的速度比较图。局部性很好,但只适用于线性内容。向量上的二进制搜索可能比地图慢。我想知道a是否会快比排序数组好吗?@MooingDuck幻灯片上确实有图表:)@MooingDuck为什么对
向量
的二进制搜索要比搜索
映射
慢?在这两种情况下,您都会在内存中四处跳跃,直到在
向量
情况下,范围缩小到适合缓存线的位置。除非所有
映射
节点一起分配