14

我想根据 lambda 的第二个元素找到std::lower_bounda std::vectorof的 。std::pair

std::vector < std::pair <int, double> > vec;
vec.resize(5);

auto it = std::lower_bound(vec.begin(), vec.end(), lambda);
// what is that lambda here?
4

2 回答 2

24

你在这里缺少一个参数,std::lower_bound需要一个开始和结束迭代器,一个值(这是你错过的),最后可以接受一个 lambda。

#include <algorithm>
#include <vector>

int main()
{
    typedef std::pair<int, double> myPair; // typedef to shorten the type name
    std::vector <myPair> vec(5);

    myPair low_val; // reference value (set this up as you want)
    auto it = std::lower_bound(vec.begin(), vec.end(), low_val, 
        [](myPair lhs, myPair rhs) -> bool { return lhs.second < rhs.second; });
}

lower_bound 的参考页在这里

于 2013-07-17T22:59:52.993 回答
14

的目的lower_bound是找到元素的位置。所以你必须指定那个元素。如果您只想按第二个合作伙伴排序,那么您只需为其指定一个值:

std::vector<std::pair<int, double>> vec = /* populate */ ; // must be sorted!

double target = 1.3;

auto it = std::lower_bound(vec.begin(), vec.end(), target,
          [](std::pair<int, double> const & x, double d)
          { return x.second < d; });

但是请注意,向量必须根据相同的谓词进行排序,因此您可能希望更永久地存储谓词:

auto lb_cmp =   [](std::pair<int, double> const & x, double d) -> bool
                { return x.second < d; };

auto sort_cmp = [](std::pair<int, double> const & x,
                   std::pair<int, double> const & y) -> bool
                { return x.second < y.second; };

std::sort(vec.begin(), vec.end(), sort_cmp);

auto it = std::lower_bound(vec.begin(), vec.end(), target, lb_cmp);
于 2013-07-17T23:00:16.730 回答