C ++ STL:将空容器传递给lower_bound

时间:2018-10-11 10:23:34

标签: c++ stl containers stl-algorithm

是否定义了将空容器传递给std::lower_bound的行为?

我检查了cppreference.com和我在网上找到的旧版本的C ++标准,但找不到确切的答案。

cppreference.com documentation for std::deque::erase有一个句子

  

如果first==last不需要首先取消迭代器的引用:删除空范围是无操作的。

对于std::lower_bound和其他算法,我想念这样的东西。

3 个答案:

答案 0 :(得分:8)

Cppreference关于std::lower_bound(first, last)的返回值:

  

“ [返回] 指向不小于值的第一个元素的迭代器,last(如果找不到这样的元素”。)。

(重点是我的)

在空范围内,将没有满足条件的元素,因此将返回last

由此得出结论,在空白范围上应用std::lower_bound(及类似内容)是定义明确的。它什么也不做,返回last,它等于first

答案 1 :(得分:3)

Standard says

  

返回:范围i中最远的迭代器[first, last],使得对于j范围中的每个迭代器[first, i),以下对应条件按住:*j < valuecomp(*j, value) != false

现在:

  1. 空容器的范围[first, last]具有单个成员,即其成员函数end()返回的迭代器。
  2. 因此,
  3. i只能end()
  4. 只有一个可行范围[first, i),即[end, end())
  5. 此范围为空,因为没有元素同时大于或等于end()且小于或等于end()小于j

由于没有每个迭代器i ,我猜引用的句子可以改写为:

返回:范围[first, last]中最远的迭代器i

这意味着可以返回的唯一end()是{{1}}。

答案 2 :(得分:2)

std :: lower_bound回答了以下问题:“在不违反顺序的情况下,可以首先插入给定元素的位置(如迭代器值之前)?”如果是[ first,last < / em>)范围是空的,唯一要插入任何内容的地方是在 last 之前(等于 first ),所以 lower_bound 返回。