如何理解`std::lower_bound`的要求?
How to understand the requirement of `std::lower_bound`?
根据关于 std::lower_bound
的 document,它说:
The range [first, last) must be partitioned with respect to the expression element < value
or comp(element, value)
, i.e., all elements for which the expression is true
must precede all elements for which the expression is false
. A fully-sorted range meets this criterion.
理解有点困难
1.What的element < value
? element
(或value
)似乎在上述文档的该段之前从未被提及。说的element
是指当前元素之前的元素,说的value
是指当前元素的值吗?
已更新:
2.Since一个特定序列是否有效(即满足要求)取决于value
,当值不同时,不能总是保证特定序列的要求。我认为定义这样的要求是没有意义的。似乎完全排序的序列更可靠和实用.
Returns an iterator pointing to the first element in the range [first,
last) that is not less than (i.e. greater or equal to) value, or last
if no such element is found.
The range [first, last) must be partitioned with respect to the
expression element < value or comp(element, value), i.e., all elements
for which the expression is true must precede all elements for which
the expression is false. A fully-sorted range meets this criterion.
根据你的问题:
What's element < value? It seems that element (or value) is never
mentioned before this paragraph in the aforementioned document. Does
the said element mean the elements before the current element, and the
said value means the value of the current element?
value
和 comp
在页面开头的函数签名中提到。 value
是调用 std::lower_bound
的参数,而 comp
是一个可选的比较函数;不应该提供比较函数,将使用 <
代替。
element
指的是[first, last)
.
范围内的每个元素
所以,std::lower_bound
所做的就是将value
与范围内的element
进行比较,直到找到第一个不“小于”的(通过<
或 comp
) value
.
std::lower_bound
工作的要求是输入范围的划分方式是所有“小于”value
的元素都放在其余元素之前;例如,如果范围已完全排序,则满足该要求。
(正如@Passerby 在下面的评论中提到的,由于分区范围要求,std::lower_bound
不需要与所有“小于”value
的元素进行比较,但是这是一个实现细节。)
What's element < value
value
是lower_bound
的参数,见页首:
template< class ForwardIt, class T > ForwardIt lower_bound( ForwardIt
first, ForwardIt last, const T& value );
此处提到的 value
是模板的最后一个参数。并且 element
,对某些元素和 序列中每个 元素的引用。
这是定义以下内容的一种相当简洁的方法:获取序列中的每个 element
,一次一个元素。当您这样做时,表达式 element < value
returns 为真的所有元素必须在序列中出现在所有其他元素之前,对于这些元素相同的表达式为假。以这种方式定义需求是明确有意的,这里是解释:
例如,如果 value
是 4
,并且我们讨论的是自然整数,下面是一个这样的序列:
1, 2, 3, 4, 5, 6
此处,此表达式为真的所有元素(1、2 和 3)出现在所有此表达式为假的元素(4、5 和 6)之前。
以下序列也是有效序列,在本例中:
3, 2, 1, 6, 5, 4
在这里,同样的事情:表达式 element < 4
为真的 3、2 和 1 出现在表达式 element < 4
为假的值 4、5 和 6 之前。所以,是的,这 也是一个有效的序列 用于调用 lower_bound
的值 4.
以下序列将不是此 特定 使用 std::lower_bound
的有效序列:
1, 2, 4, 3, 5, 6
至于为什么要以如此奇怪的方式指定此 lower_bound
要求,那将是一个不同的问题。但这就是它的意思。
分区
值列表可以分区,或根据某些标准。例如:
┌────┬────┬────┬────┬────┬────┬────┬────┐
| 2 | 7 | 3 | -5 | 11 | 94 | 15 | 12 |
└────┴────┴────┴────┴────┴────┴────┴────┘
x < 10 | x ≥ 10
在这个列表中我们有两个分区:
- x < 10 的元素
- x 不 < 10 的元素
此外,该标准暗示了一个顺序:
- 所有 xs 使得 (x < 10) 出现 —before— 所有 xs 使得 !(x < 10)
(在C++中,我们倾向于使用“比较器”或“比较函数”来指定标准。)
请注意,每个分区中元素之间的相对顺序无关紧要!也就是说,还值得注意的是,如果列表 被排序,它仍然有完全相同的两个分区:
┌────┬────┬────┬────┬────┬────┬────┬────┐
| -5 | 2 | 3 | 7 | 11 | 12 | 15 | 94 |
└────┴────┴────┴────┴────┴────┴────┴────┘
x < 10 | x ≥ 10
(我这里的示例有两个 equal-sized 分区。情况不一定如此。一个分区可能有零个或多个元素,并且每个分区的大小可能与其他分区不同。)
下界 → 分区开始索引
lower_bound
算法的作用是找到现有分区的 第一个 元素。
该算法唯一需要注意的是序列必须已经按照排序标准有意义的方式进行了分区。 (因为该算法仅 找到 个分区,它不会对东西进行排序!)
例如,我们的原始序列 不 支持将元素分为 (x < 7) 和 (x ≥ 7) 的标准,因为元素未按该标准划分方式 — 尝试找到不存在的分区的“第一个”元素是没有意义的。
这是cppreference.com所用语言的意思。
根据关于 std::lower_bound
的 document,它说:
The range [first, last) must be partitioned with respect to the expression
element < value
orcomp(element, value)
, i.e., all elements for which the expression istrue
must precede all elements for which the expression isfalse
. A fully-sorted range meets this criterion.
理解有点困难
1.What的element < value
? element
(或value
)似乎在上述文档的该段之前从未被提及。说的element
是指当前元素之前的元素,说的value
是指当前元素的值吗?
已更新:
2.Since一个特定序列是否有效(即满足要求)取决于value
,当值不同时,不能总是保证特定序列的要求。我认为定义这样的要求是没有意义的。似乎完全排序的序列更可靠和实用.
Returns an iterator pointing to the first element in the range [first, last) that is not less than (i.e. greater or equal to) value, or last if no such element is found.
The range [first, last) must be partitioned with respect to the expression element < value or comp(element, value), i.e., all elements for which the expression is true must precede all elements for which the expression is false. A fully-sorted range meets this criterion.
根据你的问题:
What's element < value? It seems that element (or value) is never mentioned before this paragraph in the aforementioned document. Does the said element mean the elements before the current element, and the said value means the value of the current element?
value
和 comp
在页面开头的函数签名中提到。 value
是调用 std::lower_bound
的参数,而 comp
是一个可选的比较函数;不应该提供比较函数,将使用 <
代替。
element
指的是[first, last)
.
所以,std::lower_bound
所做的就是将value
与范围内的element
进行比较,直到找到第一个不“小于”的(通过<
或 comp
) value
.
std::lower_bound
工作的要求是输入范围的划分方式是所有“小于”value
的元素都放在其余元素之前;例如,如果范围已完全排序,则满足该要求。
(正如@Passerby 在下面的评论中提到的,由于分区范围要求,std::lower_bound
不需要与所有“小于”value
的元素进行比较,但是这是一个实现细节。)
What's element < value
value
是lower_bound
的参数,见页首:
template< class ForwardIt, class T > ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
此处提到的 value
是模板的最后一个参数。并且 element
,对某些元素和 序列中每个 元素的引用。
这是定义以下内容的一种相当简洁的方法:获取序列中的每个 element
,一次一个元素。当您这样做时,表达式 element < value
returns 为真的所有元素必须在序列中出现在所有其他元素之前,对于这些元素相同的表达式为假。以这种方式定义需求是明确有意的,这里是解释:
例如,如果 value
是 4
,并且我们讨论的是自然整数,下面是一个这样的序列:
1, 2, 3, 4, 5, 6
此处,此表达式为真的所有元素(1、2 和 3)出现在所有此表达式为假的元素(4、5 和 6)之前。
以下序列也是有效序列,在本例中:
3, 2, 1, 6, 5, 4
在这里,同样的事情:表达式 element < 4
为真的 3、2 和 1 出现在表达式 element < 4
为假的值 4、5 和 6 之前。所以,是的,这 也是一个有效的序列 用于调用 lower_bound
的值 4.
以下序列将不是此 特定 使用 std::lower_bound
的有效序列:
1, 2, 4, 3, 5, 6
至于为什么要以如此奇怪的方式指定此 lower_bound
要求,那将是一个不同的问题。但这就是它的意思。
分区
值列表可以分区,或根据某些标准。例如:
┌────┬────┬────┬────┬────┬────┬────┬────┐
| 2 | 7 | 3 | -5 | 11 | 94 | 15 | 12 |
└────┴────┴────┴────┴────┴────┴────┴────┘
x < 10 | x ≥ 10
在这个列表中我们有两个分区:
- x < 10 的元素
- x 不 < 10 的元素
此外,该标准暗示了一个顺序:
- 所有 xs 使得 (x < 10) 出现 —before— 所有 xs 使得 !(x < 10)
(在C++中,我们倾向于使用“比较器”或“比较函数”来指定标准。)
请注意,每个分区中元素之间的相对顺序无关紧要!也就是说,还值得注意的是,如果列表 被排序,它仍然有完全相同的两个分区:
┌────┬────┬────┬────┬────┬────┬────┬────┐
| -5 | 2 | 3 | 7 | 11 | 12 | 15 | 94 |
└────┴────┴────┴────┴────┴────┴────┴────┘
x < 10 | x ≥ 10
(我这里的示例有两个 equal-sized 分区。情况不一定如此。一个分区可能有零个或多个元素,并且每个分区的大小可能与其他分区不同。)
下界 → 分区开始索引
lower_bound
算法的作用是找到现有分区的 第一个 元素。
该算法唯一需要注意的是序列必须已经按照排序标准有意义的方式进行了分区。 (因为该算法仅 找到 个分区,它不会对东西进行排序!)
例如,我们的原始序列 不 支持将元素分为 (x < 7) 和 (x ≥ 7) 的标准,因为元素未按该标准划分方式 — 尝试找到不存在的分区的“第一个”元素是没有意义的。
这是cppreference.com所用语言的意思。