Lower_bound 不适用于具有 3 个元素的向量的最后一个元素

Posted

技术标签:

【中文标题】Lower_bound 不适用于具有 3 个元素的向量的最后一个元素【英文标题】:Lower_bound not working on the last element of a vector with 3 elements 【发布时间】:2020-02-09 19:37:46 【问题描述】:
vector<int> vec = 2,4,3;
vector<int>::iterator it;
it=lower_bound(vec.begin(),vec.end(),3);
cout<<*it;

这会返回 4 而不是 3 的输出

vector<int> vec = 2,3,4;
vector<int>::iterator it;
it=lower_bound(vec.begin(),vec.end(),3);
cout<<*it;

但这会返回正确的输出 3。请帮助我理解为什么它在极端情况下会失败。

【问题讨论】:

在第一种情况下,您为什么期望3?文档说returns an iterator ... to the first element ... that is not less than ...。 【参考方案1】:

根据cppreference及其std::lower_bound的文档:

返回一个迭代器,指向范围 [first, last) 不小于 (即大于或等于) 值,或 last 如果没有找到这样的元素。

因此,std::lower_bound 返回第一个元素,它大于或等于 值(此处为 3)。

对于 2, 4, 3,第一个大于或等于 3 的元素是 4,但对于 2, 3, 4,,它是 3。

P.S.再次根据cppreference:

范围 [first, last) 必须相对于 表达式element ,即所有元素 表达式为真的元素必须在所有元素之前 表达式为假。完全排序的范围符合此标准。

您的两个向量都根据条件 (element

【讨论】:

【参考方案2】:

总之,向量2,4,3不满足lower_bound的要求。

https://en.cppreference.com/w/cpp/algorithm/lower_bound 说:

范围 [first, last) 必须相对于 表达式 element

如果您的向量未排序,请使用std::find

【讨论】:

不,turns out 相对于x &lt; 3 进行分区就足够了。

以上是关于Lower_bound 不适用于具有 3 个元素的向量的最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

lower_bound() 函数使用详解

Twitter BootStrap Confirmation 不适用于动态生成的元素

C++ 中的 lower_bound()

共享元素返回过渡不适用于片段中的 recyclerview 和 cardview

如何在向量向量上使用lower_bound?

悬停效果不适用于 z-index 较低的元素