根据对的第二个值求对向量的上界

Finding the upper bound of vector of pairs based on second value of pair

本文关键字:向量 第二个      更新时间:2023-10-16

我有一个向量对"v",它是根据对的第二个值排序的。现在我想根据这对向量的第二个值求出向量"v"的上界——在求上界的同时,我想忽略向量对中的第一个向量(std::vector<int>)。

int main () {
  std::vector<std::pair<std::vector<int>, int> > v;           //10 10 10 20 20 20 30 30
  std::vector<int> a;
  a.push_back(1);
  v.push_back(make_pair(a,10));
  a.push_back(2);
  v.push_back(make_pair(a,10));
  a.push_back(3);
  v.push_back(make_pair(a,10));
  a.push_back(4);
  v.push_back(make_pair(a,20));
  a.push_back(5);
  v.push_back(make_pair(a,20));
  a.push_back(6);
  v.push_back(make_pair(a,20));
  a.push_back(7);
  v.push_back(make_pair(a,30));
  a.push_back(8);
  v.push_back(make_pair(a,30));
  std::vector<std::pair<std::vector<int>, int> >::iterator low,up;
  std::vector<int> b;
  up= std::upper_bound (v.begin(), v.end(), make_pair(b,25)); 
  std::cout << "upper_bound at position " << (up - v.begin())<<" val="<<v[(up-v.begin())].second<< 'n';
  return 0;
}

我希望上界位置返回为6,值返回为30。但是使用上面的代码,我错误地获得位置为0和值为10。有人能建议我如何根据这对的第二个值得到上限,而忽略这对的第一个值

您需要为upper_bound提供compare函数


template<typename T>
bool compare(const T &a,const T &b){
    return a.second<b.second;
}

和变化:

up= std::upper_bound (v.begin(), v.end(), make_pair(b,25));

:

up= std::upper_bound (v.begin(), v.end(), make_pair(b,25),compare<pair<vector<int>,int>>);

要自定义std::upper_bound的行为,只需提供比较函数或函子作为第四个参数。

所以不用

up= std::upper_bound (v.begin(), v.end(), make_pair(b,25));

你会做
using Pair = decltype( *v.begin() );
up= std::upper_bound (v.begin(), v.end(), make_pair(b,25),
    []( Pair const& a, Pair const& b ) { return a.second < b.second; }
    );

如果有帮助的话。您也可以单独编写比较函数,如下所示。

    auto lambda = [](const p& p1, const p& p2) {
        return p1.first < p2.first;
    };
    int idx = upper_bound(begin(v), end(v), make_pair(b, 25), lambda) - begin(v);
    cout << idx << endl;