C ++ map :: find或map :: iterator,w.r.t复杂度更高效

时间:2012-10-19 06:09:22

标签: c++ algorithm map

我们知道map :: find返回一个迭代器,指向找到键位置的位置。此外,作为二进制搜索操作,复杂度为O(logn)。所以它似乎在内部维护了一个迭代器,并且会在成功时返回。 那么哪一个更有效的查找或迭代器,因为我认为两者都会在运行时提供相同的复杂性(我可能是不正确的)。 那么请你建议在哪里使用find以及在哪里使用迭代器。在其中一个实现中,我需要查看特定键的映射(因为它可以包含N个键,我们只对m键感兴趣)。所以find是否会更高效或迭代。 还有什么是处理查找失败案例的好方法,因为我不想在代码中添加太多if else案例会增加复杂性。

3 个答案:

答案 0 :(得分:2)

我不完全确定你的意思,但使用std::map<...>::find()比在地图的迭代器上使用std::lower_bound()更有效:内部树上的二进制搜索只是导航树并且O(log(n)) n 1}} std::lower_bound()是地图大小的表现。 operator++()也会进行二分查找,但需要使用operator--()和/或O(n)来移动迭代器。因此,它将具有{{1}}性能。我认为它甚至不应该编译,但我不完全确定它是否不能编译。

答案 1 :(得分:1)

首先,他们做了两件不同的事情。其次,这取决于实施。

答案 2 :(得分:0)

根据经验:如果您可以选择通用算法(此处为std::find)和同名的容器特定算法(此处为std::map<...>::find),则使用容器特定算法。

如果没有比通用版本更高效的话,没有人会打扰实现容器特定的容器,这将是一段时间的浪费。