當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ std::set::upper_bound和std::upper_bound的區別用法及代碼示例


先決條件: 隨機訪問迭代器,雙向迭代器

Setsassociative container 的一種類型,其中每個元素必須是唯一的,因為元素的值可以標識它。元素的值一旦添加到集合中就無法修改,但可以刪除和添加該元素的修改值。

與 Set 相關的函數:

本文重點介紹 C++ 中 std::set::upper_bound 和 std::upper_bound 之間的區別。

C++ 中的 std::upper_bound()

C++中的upper_bound()方法用於返回一個iterator,指向[first,last)範圍內第一個值大於給定值的元素。

C++ 中的 std::set::upper_bound()

set::upper_bound() C++ STL 中的內置函數,它返回一個指向容器中元素的迭代器,該元素僅大於作為參數傳遞的值 ‘x’。如果參數中傳入的key超過了容器中的最大值,那麽迭代器返回的指向集合容器中的最後一個元素。

std::upper_bound() 與 std::set::upper_bound()

以下是 std::upper_bound() 和 std::set::upper_bound() 之間的一些差異。

先生。沒有。 std::upper_bound() std::set::upper_bound()
1 句法-
std::upper_bound(ForwardIterator 首先,ForwardIterator 最後,const T& val)。
句法-
std::upper_bound(const value_type& val)。
2 std::upper_bound 具有隨機訪問迭代器和非隨機訪問迭代器。 std::set::upper optimizes_bound 具有雙向迭代器。
3 此函數優化了比較次數,這對於隨機訪問迭代器來說非常有效。 此函數優化使用雙向迭代器的比較次數。
4 對於隨機訪問迭代器,運行時間複雜度為 O(log2N),但對於非隨機訪問迭代器,運行時間複雜度為 O(N)。 由於其二叉搜索樹的實現,運行時間複雜度始終為 O(log2N)。

在下麵的示例中,我們說明了兩個函數占用的 CPU 執行時間。一般來說,std::set::upper_bound()方法優於std::upper_bound()。

示例:std::upper_bound()

下麵是說明 std::upper_bound() 函數的 C++ 程序。

C++


// C++ program to illustrate 
// std::set::upper_bound 
#include <bits/stdc++.h> 
#include <sys/time.h> 
using namespace std; 
  
// Function whose time is to 
// be measured 
void myFunction() 
{ 
    // Initialise the set 
    set<int> s; 
  
    // Insert element in the set 
    for (int i = 0; i < 10; i++) { 
        s.insert(i); 
    } 
  
    // Use upper_bound() function 
    // to find 5 
    set<int>::iterator it; 
    it = upper_bound(s.begin(), s.end(), 5); 
} 
  
// Driver Code 
int main() 
{ 
    // Use function gettimeofday() 
    // can get the time 
    struct timeval start, end; 
  
    // Start timer 
    gettimeofday(&start, NULL); 
  
    // unsync the I/O of C and C++. 
    ios_base::sync_with_stdio(false); 
  
    // Function Call 
    myFunction(); 
  
    // Stop timer 
    gettimeofday(&end, NULL); 
  
    // Calculating total time taken 
    // by the program. 
    double totalTime; 
  
    totalTime = (end.tv_sec - start.tv_sec) * 1e6; 
  
    totalTime 
        = (totalTime + (end.tv_usec - start.tv_usec)) 
          * 1e-6; 
  
    cout << "Time taken by the program is : " << fixed 
         << totalTime << setprecision(6); 
    cout << " sec" << endl; 
    return 0; 
}
輸出
Time taken by the program is : 0.000056 sec

示例: std::set::upper_bound()

下麵是說明 std::set::upper_bound() 函數的 C++ 程序。

C++


// C++ program to illustrate 
// std::upper_bound 
#include <bits/stdc++.h> 
#include <sys/time.h> 
using namespace std; 
  
// Function whose time is to 
// be measured 
void myFunction() 
{ 
    // Initialise the set 
    set<int> s; 
  
    // Insert element in the set 
    for (int i = 0; i < 10; i++) { 
        s.insert(i); 
    } 
  
    // Use set::upper_bound() function 
    // to find 5 
    set<int>::iterator it; 
    it = s.upper_bound(5); 
} 
  
// Driver Code 
int main() 
{ 
    // Use function gettimeofday() 
    // can get the time 
    struct timeval start, end; 
  
    // Start timer 
    gettimeofday(&start, NULL); 
  
    // unsync the I/O of C and C++. 
    ios_base::sync_with_stdio(false); 
  
    myFunction(); 
  
    // Stop timer 
    gettimeofday(&end, NULL); 
  
    // Calculating total time taken 
    // by the program. 
    double totalTime; 
  
    totalTime = (end.tv_sec - start.tv_sec) * 1e6; 
  
    totalTime 
        = (totalTime + (end.tv_usec - start.tv_usec)) 
          * 1e-6; 
  
    cout << "Time taken by program is : " << fixed 
         << totalTime << setprecision(6); 
    cout << " sec" << endl; 
    return 0; 
}
輸出
Time taken by program is : 0.000043 sec


相關用法


注:本文由純淨天空篩選整理自bhuwanesh大神的英文原創作品 Difference between std::set::upper_bound and std::upper_bound in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。