#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
bool comp(const pair<int,int> &a,const pair<int,int> &b)
{
return (a.first < b.first);
}
int main(void)
{
vector<pair<int,int>> data;
data.push_back(make_pair(1,7));
data.push_back(make_pair(5,5));
data.push_back(make_pair(2,7));
data.push_back(make_pair(6,7));
data.push_back(make_pair(9,6));
data.push_back(make_pair(2,4));
data.push_back(make_pair(2,8));
sort(data.begin(),data.end());
int key=9;
if(binary_search(data.begin(),data.end(),key,comp))
{
cout<<"Key found"<<endl;
}
else
{
cout<<"Key is not found"<<endl;
}
}
答案 0 :(得分:2)
您可以在(pair, int)
和(int, pair)
的结构中定义比较,因此二进制搜索中的比较知道如何将一对与int进行比较:
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
struct comp_pair_int {
bool operator()(const pair<int,int> &a, const int & b)
{
return (a.first < b);
}
bool operator()(const int & a,const pair<int,int> &b)
{
return (a < b.first);
}
};
int main(void)
{
vector<pair<int,int>> data;
data.push_back(make_pair(1,7));
data.push_back(make_pair(5,5));
data.push_back(make_pair(2,7));
data.push_back(make_pair(6,7));
data.push_back(make_pair(9,6));
data.push_back(make_pair(2,4));
data.push_back(make_pair(2,8));
sort(data.begin(),data.end());
int key=9;
if(binary_search(data.begin(),data.end(), key,comp_pair_int()))
{
cout<<"Key found"<<endl;
}
else
{
cout<<"Key is not found"<<endl;
}
}
答案 1 :(得分:0)
这主要是名称问题。 binary_search
搜索元素,因此您需要提供元素。
还有std::partition_point(begin,end, predicate)
,它假设一个分区范围。如果范围中有一个点使得前面的所有元素都满足谓词而后面的元素不满足,则对范围进行分区。 (子范围可以为空),
现在,如果将排序谓词与任何值绑定,任何已排序的范围也会被分区。例如。范围1,5,8
由value<3
分配,但也由value<0
或value<100
分配。在您的情况下,您可以定义lambda谓词[key](std::pair<int,int> p){ return p.first<key; }
。