在向量对上实现lower_bound

时间:2014-06-01 15:19:17

标签: c++ vector std-pair lower-bound

我知道我们需要包含一些比较功能才能实现这一目标。

但是不能写这个。

例如:

vector = {(2,4),(4,2),(5,1),(5,3)}

的元素

找到= 5

lower_bound()应返回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());
}

4 个答案:

答案 0 :(得分:4)

由于您不关心pp的第二个值,因此只需构造一个具有任何值作为第二个元素的临时pp对象。

int id = std::lower_bound(v.begin(), v.end(), pp(5, 0), cmp) - v.begin();

答案 1 :(得分:3)

just like tuples)无论如何要比较按字典顺序。您不需要为此定义任何特殊比较器

由于您正在使用lower_bound,因此您要搜索的第一个元素与您搜索的val之间的差异不大,因此您应该使用min值作为第二对元素。总而言之,所有都可以在&#34;两个&#34;代码行

sort(v.begin(),v.end());
auto id = distance(v.begin(), lower_bound(v.begin(),v.end(), 
       make_pair(5, numeric_limits<int>::min())) );

一些注释:

  1. 使用std::distance计算两个迭代器之间的元素数
  2. std::distance的返回类型是无符号类型。除非你需要负索引(类似于#34的Python语法;从末尾开始计数&#34;索引),否则保持索引未签名是一个好习惯。

答案 2 :(得分:1)

我认为你应该根据lower_bound的定义来比较这些对 所以,

   typedef pair<int,int> pp;
   //...

   int id=(int)(lower_bound(v.begin(),v.end(), 
                pp(5,std::numeric_limits<int>::min())), //Value to compare
                [](const pp& lhs, const pp& rhs)       // Lambda
                {
                    return lhs < rhs ;                //  first argument < second
                }
                 ) - v.begin()
               );

答案 3 :(得分:0)

您可以使用自定义比较运算符对成对向量使用lower_bound。

在这种情况下,您需要像这样传递四个参数:-

  • it1 = 搜索位置的迭代器位置

  • it2 = 直到搜索位置的迭代器位置

lower_bound (it1 ,it2 , find_element, your_comparator )

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