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 < 3
进行分区就足够了。以上是关于Lower_bound 不适用于具有 3 个元素的向量的最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章
Twitter BootStrap Confirmation 不适用于动态生成的元素