我需要在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
进行第二次通话,我是否应该预料到任何缺点?
答案 0 :(得分:3)
主要缺点是非成员std::lower_bound
必须依赖map
提供的双向迭代器。因此,虽然它能够执行O(log(n))比较,但它仍然必须执行O(n)次迭代。
另一方面,成员lower_bound()
知道地图的内部结构,通常是某种二叉树。这意味着能够以标准算法不能的方式遍历。