2017-03-14 68 views
-2

我正在执行某些算法,我在这个算法中使用了map<string,map<string,double>>。它完美地工作,给出正确的结果,但如果我更改map<string,map<string,double>>unordered_map<string,map<string,double>>,我的算法停止对某些输入的工作。地图vs无序地图

我想问我是否缺少unordered_mapmap之间的差异。有没有可能导致这种情况的重要事情?

编辑:这是弗洛伊德 - Warshall算法,我不认为是竟被数据排序的问题。 Onlt我使用的map仅用于制作一个矩阵,其中包含2个节点之间的边缘值信息。

+0

什么算法? “停止工作”是什么意思? – user1810087

+0

这可能是因为你的程序在某个时候调用了未定义的行为,而这发生在幸运地用'map <,>'而不是'unordered_map <,>'来做你想要的。请发布[MVCE](https://stackoverflow.com/help/mcve)。 – cdhowie

+0

Floyd-Warshall ..我不能释放,这就是为什么我问是否有任何可能导致此问题的差异。我认为应该没有什么区别。只有在时间复杂度为 – scarface

回答

0

是的,unordered_map包含无序数据。所以如果你的算法需要有序的数据,alogirtm将会失败。

1

取决于是什么算法。 map会自动按键排序它的元素,而unordered_map不会打扰。

因此,您可能会发现即使它们中包含的数据相同,它的排列顺序也不相同,并且会干扰您的结果。

map对于静态数据是最好的,事实上,按键排序可以让它更快地找到事物。但是排序会很费时,所以如果你需要map,但它会不断修改,unordered_map可以成为更快的选择。

+0

已编辑 - >添加算法 – scarface

+0

@scarface发布您的代码。 – Havenard

+1

*“'map'对于静态数据来说是最好的选择,按键排序的事实使它能够更快地找到事物。”*我对这一说法提出异议。 'map'中的查找具有O(log n)时间复杂度,而'unordered_map'中的查找具有平均O(1)时间复杂度。在墙上时间中实际上是否会比另一个更快取决于元素的数量,无序映射中的冲突数量以及应用程序的访问模式。 – cdhowie

0

好的,所以 - 我的问题的答案是:mapunordered_map之间没有任何其他根本区别。如果我不需要排序的数据,我只需更改mapunordered_map,一切都可以。

我认为,除了排序后的数据之外,没有这两个问题。