根据对的第二个值查找对向量的上限

Posted

技术标签:

【中文标题】根据对的第二个值查找对向量的上限【英文标题】:Finding the upper bound of vector of pairs based on second value of pair 【发布时间】:2015-07-11 06:22:31 【问题描述】:

我有一个对“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。有人可以建议我如何获取上限仅基于对的第二个值,而忽略对的第一个值

【问题讨论】:

【参考方案1】:

你需要为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>>);

【讨论】:

【参考方案2】:

要自定义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; 
    );

【讨论】:

【参考方案3】:

如果这有帮助。也可以单独写比较函数,如下图。

    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;

【讨论】:

以上是关于根据对的第二个值查找对向量的上限的主要内容,如果未能解决你的问题,请参考以下文章

如何根据对的第二个元素对对的向量进行排序?

从特定的第一个元素获取向量对的第二个元素

如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?

python一个列表中元素为元祖,想要根据元祖的第二个值进行排序,怎么做

C ++ STL列表运算符重载对(根据第一个值排序,使用第二个值访问)

C ++ - 同时对一对向量的第一个和第二个进行排序