Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量对上下界的实现_C++_Vector_Std Pair_Lower Bound - Fatal编程技术网

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=迭代器位置,直到要搜索的位置

    下限(it1、it2、查找元素、您的\u比较器)

    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()
    是如何工作的吗?@KPMG
    numeric_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;
    }