簡體   English   中英

在C ++中的有序向量中搜索范圍[x,y] [使用lower_bound()和upper_bound()]

[英]Searching for a range [x,y] in a sorted vector in C++ [using lower_bound() and upper_bound() ]

我有一組排序的矢量,

vector <int> b [1000009];

現在我必須在行b [因子]中搜索x和y之間的范圍。
'factor','x'和'y'都是整數。
我使用了以下approch:

        int lb,ub;
        if(b[factor][0]>=x){lb=0;}
        else
            {
                lb=upper_bound(b[factor].begin(),b[factor].end(),x)-b[factor].begin();
                while(b[factor][lb-1]>=x)lb--;
            }
        if(b[factor][sz2-1]<=y)
            {
                ub=sz2-1;
            }
        else {
                ub=lower_bound(b[factor].begin(),b[factor].end(),y)-b[factor].begin();
                while(b[factor][ub]>y)ub--;
            }

但這種方法並沒有給出正確的答案。 此外,我想使用一些比較器功能來實現相同的功能。 這是我第一次使用lower_bound()upper_bound() 那么請告訴我如何在這里實現比較器功能。

std::lower_bound返回其值大於或等於參數的第一個元素的位置。 std::upper_bound返回大於參數的第一個元素的位置。 您可以使用它們迭代x和y之間的值范圍,如下所示:

  auto vb = b[factor].begin();
  auto ve = b[factor].end();
  auto lb = lower_bound(vb,ve,x);
  auto ub = upper_bound(vb,ve,y);
  for (auto i=lb; i!=ub; ++i) {
    // Do something with *i
  }

我們來看看這個例子吧。 假設我們的向量包含以下值:

1 3 4 7 9

讓我們說x = 3和y = 7。 std::lower_bound(vb,ve,x)將返回大於或等於3的第一個值的位置。由於有一個等於3的值,它的位置就是我們為下限獲得的位置。

std::upper_bound(vb,be,y)將返回大於7的第一個值的位置。在這種情況下,這將是9的位置。

所以我們的循環從3的位置開始,但不包括9的位置,這正是我們想要的值的范圍。

現在如果x = 5和y = 6怎么辦? 該范圍內沒有值。 它會做什么?

大於或等於5的第一個值是7.第一個大於6的值也是7.所以lbub將是相同的位置! 我們的循環會立即終止,這正是我們想要的,因為我們的范圍內沒有元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM