lower_bound和upper bound在c ++

时间:2017-09-27 01:16:21

标签: c++ stl

我有2个向量,每个向量包含某些元素

   for(int i=0;i<vec1.size();i++){
    int low = lower_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
    int up = upper_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
    }

   for(int i=0;i<vec1.size();i++){
    int low = lower_bound(vec1.begin(),vec1.end(),vec2[i])-vec1.begin();
    int up = upper_bound(vec1.begin(),vec1.end(),vec2[i])-vec1.begin();
    }

以下是整个代码段:

    for(int i=0;i<n;i++)
       for(int j=0;j<n;j++)
          for(int k=0;k<n;k++)
            vec1.push_back((arr[i]*arr[j])+arr[k]);
    for(int i=0;i<n;i++)
       for(int j=0;j<n;j++)
         for(int k=0;k<n;k++)
         {
           if(arr[k]==0)
           continue;
           else
           vec2.push_back((arr[i]+arr[j])*arr[k]);
          }
sort(vec1.begin(),vec1.end());
sort(vec2.begin(),vec2.end());
int res=0;
    for(int i=0;i<vec1.size();i++)
    {
        int low = lower_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
        int up = upper_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
        res+=(up-low);
    }


for(int i=0;i<vec1.size();i++)
        {
            int low = lower_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
            int up = upper_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
            res+=(up-low);
        }

现在基本上我要做的是找到vec1和vec2中元素的总出现次数。我面临的问题是即使两个代码实际上都实现相同的逻辑,也会为res提供不同的值。 这不应该发生,因为它们的逻辑相同。 使用的载体具有相同的大小。 这在某种程度上是我不知道的下界和上界的意外行为吗?

1 个答案:

答案 0 :(得分:0)

这是您的完整代码吗? 我在你的代码中不明白你想要什么?

int res=0;
for(int i=0;i<vec1.size();i++)
{
    int low = lower_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
    int up = upper_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
    res+=(up-low);
}
for(int i=0;i<vec1.size();i++)
        {
            int low = lower_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
            int up = upper_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
            res+=(up-low);
        }

如果要计算两者中出现的值,则应使用res1和res2等2个变量。

我想你想这样做:

  

例如:如果arr = [1,2]则vec1和vec2都包含[2,3,3,3,4,4,5,6]   排序后。你想要找到2,3,4,5和6的出现   两个载体。我是对的吗?

如果是,那么您首先需要在向量中找到唯一值。但是现在您在循环中三次搜索值3。

将这两个向量转换为集合后。使用以下代码。

int res=0;
for(int i=0;i<vec1.size();i++)
{
    int low = lower_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
    int up = upper_bound(vec2.begin(),vec2.end(),vec1[i])-vec2.begin();
    res+=(up-low);
}

int res2=0;
    for(int i=0;i<vec2.size();i++)
            {
                int low = lower_bound(vec1.begin(),vec1.end(),vec2[i])-vec1.begin();
                int up = upper_bound(vec1.begin(),vec1.end(),vec2[i])-vec1.begin();
                res2+=(up-low);
            }
// Compare res and res2 here.

你错过的另一件事是你在两个循环中都在向量看。在第一个循环中,你应该在vector2中设置set1的值,在vector1中设置set2的第二个循环值。

希望这是你想要的。如果没有,请在评论中提问。我会修改我的答案。