【问题标题】:Lower_bound not working on the last element of a vector with 3 elementsLower_bound 不适用于具有 3 个元素的向量的最后一个元素
【发布时间】: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。请帮助我理解为什么它在极端情况下会失败。

【问题讨论】:

标签: c++ algorithm c++11 vector lower-bound


【解决方案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 进行分区就足够了。
    猜你喜欢
    • 2012-08-20
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2018-02-01
    • 2012-03-11
    相关资源
    最近更新 更多