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() 1 Syntax-
std::upper_bound(ForwardIterator first, ForwardIterator last, const T& val).Syntax-
std::upper_bound(const value_type& val).2 The std::upper_bound has Random Access Iterators and Non Random Access Iterators. The std::set::upper optimizes_bound has Bidirectional Iterators. 3 This function optimizes the number of comparisons which is efficient for Random Access Iterators. This function optimizes the number of comparisons using Bidirectional Iterators. 4 The 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