📜  C++ 中 std::set::upper_bound 和 std::upper_bound 的区别

📅  最后修改于: 2022-05-13 01:55:38.671000             🧑  作者: Mango

C++ 中 std::set::upper_bound 和 std::upper_bound 的区别

先决条件:随机访问迭代器、双向迭代器

集合是一种关联容器,其中每个元素都必须是唯一的,因为元素的值标识了它。元素的值一旦添加到集合中就无法修改,尽管可以删除和添加该元素的修改值。

与 Set 相关的函数:

  • begin() 返回指向集合中第一个元素的迭代器。
  • end() 返回一个迭代器,指向集合中最后一个元素之后的理论元素。
  • size() 返回集合中元素的数量。
  • max_size() 返回集合可以容纳的最大元素数。
  • empty() 返回集合是否为空。

本文重点介绍 C++ 中 std::set::upper_bound 和 std::upper_bound 之间的区别。

C++ 中的 std::upper_bound()

C++ 中的 upper_bound() 方法用于返回一个迭代器,该迭代器指向范围 [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() 之间的一些区别。

Sr. No.std::upper_bound() std::set::upper_bound()
1Syntax-
std::upper_bound(ForwardIterator first, ForwardIterator last, const T& val).
Syntax-
std::upper_bound(const value_type& val).
2The std::upper_bound has Random Access Iterators and Non Random Access Iterators.The std::set::upper optimizes_bound has Bidirectional Iterators.
3This function optimizes the number of comparisons which is efficient for Random Access Iterators.This function optimizes the number of comparisons using Bidirectional Iterators.
4The running time complexity is O(log2N) for random-access iterators but for non-random-access iterators, it is O(N).The running time complexity is always O(log2N) due to its Binary Search Tree implementation.

在下面的示例中,我们说明了这两个函数占用的 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 
#include 
using namespace std;
  
// Function whose time is to
// be measured
void myFunction()
{
    // Initialise the set
    set s;
  
    // Insert element in the set
    for (int i = 0; i < 10; i++) {
        s.insert(i);
    }
  
    // Use upper_bound() function
    // to find 5
    set::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;
}


C++
// C++ program to illustrate
// std::upper_bound
#include 
#include 
using namespace std;
  
// Function whose time is to
// be measured
void myFunction()
{
    // Initialise the set
    set 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::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 the program is : 0.000056 sec

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

下面是说明 std::set::upper_bound()函数的 C++ 程序。

C++

// C++ program to illustrate
// std::upper_bound
#include 
#include 
using namespace std;
  
// Function whose time is to
// be measured
void myFunction()
{
    // Initialise the set
    set 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::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