在地图中搜索:成员与非成员lower_bound

时间:2014-08-06 13:41:39

标签: c++ map stl

我需要在std::map中查找两个元素。由于我的地图稀疏,我可能没有每个键的条目,因此我使用lower_bound进行查找。为了简单起见,我们假设我总能找到这样的两个元素,并且它们总是不同的。

最快的解决方案当然是:

auto it1 = my_map.lower_bound(k1);
auto it2 = my_map.lower_bound(k2);

但是,我知道索引k2处的元素位于begin和索引k1之间的元素之间。因此,我考虑使用std::lower_bound进行第二次查找,以避免再次搜索整个范围:

auto it1 = my_map.lower_bound(k1);
auto it2 = std::lower_bound(begin(my_map), it1, k2);

关于第二种解决方案的任何意见?复杂性它应该更好,但它看起来比原始代码更令人愉快,我想知道它是否值得打扰。另外,由于我使用非成员lower_bound进行第二次通话,我是否应该预料到任何缺点?

1 个答案:

答案 0 :(得分:3)

主要缺点是非成员std::lower_bound必须依赖map提供的双向迭代器。因此,虽然它能够执行O(log(n))比较,但它仍然必须执行O(n)次迭代。

另一方面,成员lower_bound()知道地图的内部结构,通常是某种二叉树。这意味着能够以标准算法不能的方式遍历。