2012-01-05 82 views
8

在有效的STL斯科特迈尔斯(195页)有以下行:测试LOWER_BOUND的返回值迭代器

“LOWER_BOUND的结果必须进行测试,看它是否指向你的价值与find不同,你不能仅仅针对end迭代器测试lower_bound的返回值。“

任何人都可以解释为什么你不能这样做?似乎为我工作得很好。

+0

这本书在当时的背景是什么?不知道这本书是在说什么,这是令人困惑的。是否使用'lower_bound'来查看集合中是否包含值? – Justin 2018-01-22 06:33:49

回答

9

它适合你,因为你的元素是存在的。

lower_bound返回一个迭代到第一元件不少于大于给定值,并upper_bound返回一个迭代到第一元件大于给定值时

鉴于阵列1, 2, 3, 3, 4, 6, 7lower_bound(..., 5)将返回指向6.

因此,检查所述值是否存在的两种方式的迭代器:

  • 使用equal_range也得到了upper_bound(计算单独lower_boundupper_bound可能会不理想)。如果边界之间的std::distance大于0,则表示元素存在。

    1, 2, 3, 3, 4, 6, 7 
    std::distance(std::lower_bound(v.begin(),v.end(),5), std::upper_bound(v.begin(),v.end(),5)) == 0 // 6 is absent 
    std::distance(std::lower_bound(v.begin(),v.end(),3), std::upper_bound(v.begin(),v.end(),3)) == 2 // 3 is present 
    
  • 通过比较符合您的价值迭代器指向的元素(为运营商提供!=<是一致的),但你必须确保它不会返回结束迭代。

    *(std::lower_bound(v.begin(), v.end(), 5)) != 5 
    

此外,由于lower_bound是一个二进制搜索算法如果没有找到该元素,这将是不一致的返回end。实际上,这个算法返回的迭代器可以用作后续插入操作的提示。

+0

+1:但正如迈尔斯在该书中所说,比较平等不会总是有效(因为'lower_bound'使用'<',而不是'==')。 – 2012-01-05 10:43:21

+0

@Oli Charlesworth:如果你重写'<',你应该重写'=='。改编的答案。 – Benoit 2012-01-05 10:44:59

+2

即使你这样做,他们也不一定对应:'=='对应于“平等”,'<'对应于“等同”。有关这方面的讨论,请参阅有效STL的第19项。 – 2012-01-05 10:48:18