本文主要是介绍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的结尾。
结果如下:
以上
————————————————
注:转载仅作为笔记使用,如有侵权请联系
试验后,如果想查找第二维,只需要将bool operator<(const MY m)const中的a<m.a改为b<m.b即可。就可以按照b值进行排序,并且二分查找到所需的b值。
注意两者的区别:
lower_bound返回的是大于等于,当存在多个要查找值时返回第一个。
upper_bound返回第一个大于该元素的下标。
并且返回的是位置或者迭代器。
这篇关于c++ 结构体和vector进行lower_bound和upper_bound的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!