C++ 向量对上下界的实现
我知道我们需要包含一些比较函数来实现这一点 但我不能为这本书写作 例如: 向量的元素=C++ 向量对上下界的实现,c++,vector,std-pair,lower-bound,C++,Vector,Std Pair,Lower Bound,我知道我们需要包含一些比较函数来实现这一点 但我不能为这本书写作 例如: 向量的元素={(2,4)、(4,2)、(5,1)、(5,3)} 找到=5 下限()应返回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.begi
{(2,4)、(4,2)、(5,1)、(5,3)}
找到=5
下限()应返回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());
}
#定义pp对
bool cmp(常量pp&l、常量pp&r){
返回l.first
因为您不关心pp
的第二个值,所以只需构造一个临时pp
对象,将任何值作为第二个元素
int id = std::lower_bound(v.begin(), v.end(), pp(5, 0), cmp) - v.begin();
我认为你应该根据
下限的定义来比较这对
所以
typedef对pp;
//...
int id=(int)(下限(v.begin(),v.end(),
pp(5,std::numeric_limits::min()),//要比较的值
[](常数pp和lhs,常数pp和rhs)//Lambda
{
返回lhs
对()无论如何都要按词典进行比较。您不需要为此定义任何特殊的比较器
由于您使用的是lower_bound
,您将搜索的第一个元素的比较值不小于您正在搜索的val
,因此您应该使用min
值作为第二对元素。总之,所有操作都可以在“两”行代码中完成:
sort(v.begin(),v.end());
auto id = distance(v.begin(), lower_bound(v.begin(),v.end(),
make_pair(5, numeric_limits<int>::min())) );
排序(v.begin(),v.end());
自动id=距离(v.begin(),下限(v.begin(),v.end(),
配对(5,数字限制::min());
一些注意事项:
std::distance
计算两个迭代器之间的元素数std::distance
的返回类型是无符号类型。除非您需要负索引(类似于Python的“从末尾开始计数”索引语法),否则保持索引无符号是一种很好的做法李>
您可以使用自定义比较运算符对向量的下界 在这种情况下,需要传递四个参数,如下所示:-
- it1=从何处搜索的迭代器位置
- it2=迭代器位置,直到要搜索的位置
auto-myComp=[&](对e1,对e2){
if(e1.秒!=e2.秒)
return e1.second我建议用typedef std::pair pp;
代替宏定义。但是宏定义也可以!user2826957是的,但这不是合适的方法。这正是typedef
s的作用。@user2826957“宏定义也可以!”–不,除了你的小例子之外,它没有。这在这里和其他地方已经被解释得透不过气来。最好使用std::numeric_limits::min()
而不是0
。你能解释一下numeric_limits::min()
是如何工作的吗?@KPMGnumeric_limits
提供了有关数字类型的信息。min()
是一个静态函数,返回可由T
表示的最小数字(此处:T
=int
)。同样地,数值限制::max()
提供了可由类型T
表示的最大数字。例如,在编写查找最小值或最大值的函数时,这些数字非常有用。我猜numeric\u limits::max()
只是将int的所有位设置为1。
sort(v.begin(),v.end());
auto id = distance(v.begin(), lower_bound(v.begin(),v.end(),
make_pair(5, numeric_limits<int>::min())) );
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;
}