c++ 结构体和vector进行lower_bound和upper_bound

总述:

介绍结构体数组和包含结构体的vector怎么样使用lower_bound进行二分查找,upper_bound同理。

前提:

lower_bound:返回数组中第一个大于等于该元素的下标,int aa = lower_bound(array,array+arrayLen,num) - array;

upper_bound:返回数组中第一个大于该元素的下标:int aa = upper_bound(array,array+arrayLen,num) - array;

结构体中查找:

把我们需要查找的数封装成一个结构体。然后才可以在结构体重进行查找。即使我们只需要针对某一维进行查找,也需要把整个结构体构造出来。

代码如下:

struct MY{
    int a,b;
    MY(){}
    MY(int a,int b):a(a),b(b){}
    bool operator<(const MY m)const{ //定义比较方式,这一步很重要
        return a<m.a;
    }
};

int main(){
    MY m[10];
    for(int i=0;i<10;i++){
        m[i] = MY(i+1,2*i);
        cout<<m[i].a<<"  "<<m[i].b<<endl;
    }
    cout<<"请输入你需要查找的数字a:"<<endl;
    int num;
    cin>>num;
    sort(m,m+10);//进行二分之前需要排序
    int aa =  lower_bound(m,m+10,MY(num,0)) - m;  //需要把我们查找的数封装成一个结构体才能进行查找。
    cout<<"查到位置为:"<<aa<<endl;
    return 0;
}

这里我只需要查找第一维,并且我对第一维进行了排序,只有有序数列才可以进行二分,然后在查找的时候,把其他维置零即可。但是必须要封装成一个结构体

vector中也是同理:

代码:

struct MY{
    int a,b;
    MY(){}
    MY(int a,int b):a(a),b(b){}
    bool operator<(const MY m)const{ //定义比较方式,这一步很重要
        return a<m.a;
    }
};

int main(){
    vector<MY>ve;
    for(int i=0;i<10;i++){
        ve.push_back(MY(i+1,2*i));
        cout<<ve[i].a<<"  "<<ve[i].b<<endl;
    }
    cout<<"请输入你需要查找的数字a:"<<endl;
    int num;
    cin>>num;
    sort(ve.begin(),ve.end());//进行二分之前需要排序
    int aa =  lower_bound(ve.begin(),ve.end(),MY(num,0)) - ve.begin();  //需要把我们查找的数封装成一个结构体才能进行查找。
    cout<<"查到位置为:"<<aa<<endl;
    return 0;
}

ve.begin()指向vector的开始,ve.end()指向vector的结尾。

结果如下:

以上

lower_bound函数可以用于在有序的结构体数组中查找某个元素的位置。在引用\[1\]中的代码中,结构体node被封装成了一个数组hah,并且通过sort函数按照结构体中的s属性进行排序。然后,在while循环中,通过lower_bound函数找到第一个大于等于给定值kk的元素的位置,并将其减去数组的起始位置,得到tt。最后,通过hah\[tt+k-1\]可以访问到第tt+k-1个结构体元素,即找到了符合条件的结构体。\[1\] #### 引用[.reference_title] - *1* [STL之lower_bound,upper_bound二分查找函数 结构体](https://blog.youkuaiyun.com/mrcrack/article/details/104516040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [lower_boundupper_bound模拟及解析](https://blog.youkuaiyun.com/RunningBeef/article/details/113811575)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)](https://blog.youkuaiyun.com/qq_37529913/article/details/125139815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值