如何在向量中找到第一个小于整数X的元素? (C ++)

时间:2012-11-15 14:11:38

标签: c++ stl vector binary-search

如果我有以下载体{10 10 10 20 20 20 30 30} 我希望函数返回整数的位置= X或直接返回X之后的较小元素,例如,如果我正在搜索11我希望函数返回2,因为第二个元素(10)是第一个较小的元素比向量中的11元。
我尝试使用lower_bound,但这不起作用。

int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20
vector<int>::iterator low,up;

sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30

low=lower_bound (v.begin(), v.end(), 11); //
up= upper_bound (v.begin(), v.end(), 11); //

cout << "lower_bound at position " << int(low- v.begin()) << endl;
cout << "upper_bound at position " << int(up - v.begin()) << endl;

return 0;

此代码输出:

lower_bound at position 3
upper_bound at position 3

4 个答案:

答案 0 :(得分:8)

cppreference告诉我std::lower_bound

  

返回指向不小于值

的范围[first,last]中第一个元素的迭代器

std::upper_bound

  

返回指向大于值

的范围[first,last]中第一个元素的迭代器

在这种情况下,给定一个包含10 10 10 20 20 20 30 30的向量,我希望两个函数都指向第一个20,它位于向量中的第3位,并且确实是两次得到的结果。如果你反而要求20std::lower_bound将返回一个迭代器,指向向量中的第一个20(位置3)......第一个数字不小于20且相同在询问11时你得到的结果。但在这种情况下,std::upper_bound将返回指向第一个30(位置6)的迭代器,这是第一个大于20的值。

只需将迭代器移回一个以获得小于目标数的最后一个值,std::prev是一种方法。

答案 1 :(得分:1)

well upper_bound会返回大于测试项目的第一个项目,那么之前的项目(如果存在)将是您想要的项目吗?

答案 2 :(得分:0)

你可以这样做......如果向量是空的,最好还是返回一个迭代器......

auto find_next_smaller(vector<int> vec, const int x) { 
    std::sort(vec.begin(), vec.end());
    auto it = std::lower_bound(vec.begin(), vec.end(), x); 
    if (it == vec.end()) { 
      it = (vec.rbegin()+1).base();
    }
    else if (it != vec.begin() && *it > x) { 
        --it; 
    }

    return it; 
} 

答案 3 :(得分:0)

如果必须找到一个小于或等于某个x的元素,则可以使用多重集。

#include <iostream> 
#include <set> 
#include <iterator> 

using namespace std; 

int main() 
{
    multiset <int, greater <int> > iammultiset;
    iammultiset.insert(10);
    iammultiset.insert(10);
    iammultiset.insert(14);
    iammultiset.insert(20);
    iammultiset.insert(20);
    iammultiset.insert(30);
    iammultiset.insert(40);
    iammultiset.insert(50);
    //{10,10,14,20,20,30,40,50}
    
    cout<<*iammultiset.lower_bound(17) << endl;
    //The Output here will be 14.
    
    cout<<*iammultiset.lower_bound(20) << endl;
    //The Output here will be 20.
}