基于对的第二个值求出对的向量的上界

时间:2015-07-11 06:22:32

标签: c++ vector

我有一对“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;
}

我希望将upper_bound位置返回为6并将值返回为30.但是使用上面的代码我错误地将位置设置为0并且值为10.有人可以建议我如何获得上限仅基于该对的第二个值,并忽略该对的第一个值

3 个答案:

答案 0 :(得分:1)

您需要向compare

提供upper_bound功能
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>>);

答案 1 :(得分:1)

要自定义std::upper_bound的行为,您只需supply a comparison function or functor as the fourth argument

所以而不是

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; }
    );

答案 2 :(得分:0)

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

    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;