我知道我们需要包含一些比较功能才能实现这一目标。
但是不能写这个。
例如:
vector = {(2,4),(4,2),(5,1),(5,3)}
找到= 5
lower_bound()应返回2
代码 - >
#define pp pair<int,int>
bool cmp(const pp &l,const pp &r) {
return l.first < r.first;
}
int main() {
vector<pp> v;
sort(v.begin(), v.end(), cmp);
int id=(int)(lower_bound(v.begin(), v.end(), ??) - v.begin());
}
答案 0 :(得分:4)
由于您不关心pp
的第二个值,因此只需构造一个具有任何值作为第二个元素的临时pp
对象。
int id = std::lower_bound(v.begin(), v.end(), pp(5, 0), cmp) - v.begin();
答案 1 :(得分:3)
对(just like tuples)无论如何要比较按字典顺序。您不需要为此定义任何特殊比较器。
由于您正在使用lower_bound
,因此您要搜索的第一个元素与您搜索的val
之间的差异不大,因此您应该使用min
值作为第二对元素。总而言之,所有都可以在&#34;两个&#34;代码行:
sort(v.begin(),v.end());
auto id = distance(v.begin(), lower_bound(v.begin(),v.end(),
make_pair(5, numeric_limits<int>::min())) );
一些注释:
std::distance
计算两个迭代器之间的元素数std::distance
的返回类型是无符号类型。除非你需要负索引(类似于#34的Python语法;从末尾开始计数&#34;索引),否则保持索引未签名是一个好习惯。 答案 2 :(得分:1)
我认为你应该根据lower_bound
的定义来比较这些对
所以,
typedef pair<int,int> pp;
//...
int id=(int)(lower_bound(v.begin(),v.end(),
pp(5,std::numeric_limits<int>::min())), //Value to compare
[](const pp& lhs, const pp& rhs) // Lambda
{
return lhs < rhs ; // first argument < second
}
) - v.begin()
);
答案 3 :(得分:0)
您可以使用自定义比较运算符对成对向量使用lower_bound。
在这种情况下,您需要像这样传递四个参数:-
it1 = 搜索位置的迭代器位置
it2 = 直到搜索位置的迭代器位置
lower_bound (it1 ,it2 , find_element, your_comparator )
auto myComp = [&](pair<int,string> e1, pair<int,string> e2) {
if(e1.second!=e2.second)
return e1.second<e2.second;
else
return e1.first<e2.first;
};
void Show_sample_code()
{
vector<pair<int,string>> data={{1, "sahil"}, {2, "amin"}};
sort(data.begin(), data.end(), myComp);
pair<int, string> p={1,"sahil"};
auto it=lower_bound( data.begin(), data.end(), p, myComp ) ;
if(it!=data.end())
cout<<"found at index="<<distance(data.begin(), it)<<endl;
else
cout<<"notfound"<<endl;
return;
}