这是代码。结果,我得到“ 4 4”。不明白为什么它不是“ 2 4”(根据上下限的定义)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v = {1, 2, 4, 5};
vector<int>::iterator s , f;
s = lower_bound(v.begin(), v.end(), 3);
f = upper_bound(v.begin(), v.end(), 3);
cout << (*s) << " " << (*f);
return 0;
}
答案 0 :(得分:5)
返回指向范围内第一个元素的迭代器 [first,last)的总和不小于 val 。
不小于3
的第一个元素(从向量的开头)为4
,因此lower_bound
返回4
。
返回指向范围 [first,last)中第一个元素的迭代器,该元素的比较值大于 val 。
(从向量的开头开始)大于3
的第一个元素是4
,因此upper_bound
返回4
。
造成这种混乱的原因是因为upper_bound
返回的第一个元素大于给定值,因此,对称起见,我们期望lower_bound
返回最后一个元素(从向量的开头)小于给定值。但是,a std
函数并没有遵循这种“预期的”对称性。
答案 1 :(得分:4)
在知道std::equal_range()
返回一对迭代器的情况下,更容易理解/记住std::lower_bound()
和std::upper_bound()
返回的内容,其中第一个等于std::lower_bound()
返回,第二个等于std::upper_bound()
返回的值。
因此,在不同情况下,使用参数4
进行调用:
1 2 3 4 4 4 4 5 E
| |
F S - first points to the first element, second to the one behind last, representing range which contains 4
1 2 3 4 5 E
| |
F S same for one element
1 2 3 4 E
| |
F S same as before, but 4 is the last element
1 2 3 5 E
|
F==S first == second, which means range for elements equal to 4 is empty
1 2 3 E
|
F==S same as before but there is no element greater than 4
E
表示container.end()
返回的内容-在最后一个元素后面的迭代器。
答案 2 :(得分:2)
不幸的是,lower_bound
和upper_bound
的命名会引起混淆。这些名称是指在一个序列中搜索的结果,该序列包含多个元素,这些元素与您要搜索的元素完全相同; lower_bound
将迭代器返回到起点,upper_bound
返回结束点之后的一个。
当元素不是序列的一部分时,它们都将迭代器返回到第一个大于您要搜索的元素的元素。如果没有更多迭代器,则可能是end
迭代器。