先決條件: C++ 中的隨機訪問迭代器,C++ 中的雙向迭代器.
C++ 中的 std::lower_bound:
lower_bound中的方法C++用於返回指向範圍中第一個元素的迭代器[第一個,最後一個]其值不小於給定值。這意味著該函數返回剛好大於該數字的下一個最小數字的索引。
C++ 中的 std::set::lower_bound:
set lower_bound()是一個內置函數C++ STL它返回一個指向容器中元素的迭代器,相當於K傳入參數。如果 K 不存在於設置容器,該函數返回一個指向下一個元素的迭代器,該元素恰好大於K。如果參數中傳入的key超過了容器中的最大值,那麽迭代器返回的指向集合容器中的最後一個元素。
下麵是之間的區別std::lower_bound和std::set::lower_bound:
編號 | std::lower_bound() | std::set::lower_bound() |
---|---|---|
1 | 用法:std::lower_bound(ForwardIterator 首先,ForwardIterator 最後,const T& val)。 | 用法:std::lower_bound(const value_type& val)。 |
2 | std::lower_bound 具有隨機訪問迭代器和非隨機訪問迭代器。 | std::set::lower_bound 具有雙向迭代器。 |
3 | 此函數優化了比較次數,這對於隨機訪問迭代器來說非常有效。 | 此函數使用雙向迭代器優化比較次數 |
4 | 對於隨機訪問迭代器,運行時間複雜度為 O(log2N),但對於非隨機訪問迭代器,運行時間複雜度為 O(N)。 | 由於它是二叉搜索樹實現,因此運行時間複雜度始終為 O(log2N)。 |
下麵是CPU execution time 的程序,它將說明兩個函數的運行時間。
程序來說明std::lower_bound():
// C++ program to illustrate
// std::set::lower_bound
#include <bits/stdc++.h>
#include <sys/time.h>
using namespace std;
// Function whose time is to
// be measured
void fun()
{
// Initialise the set
set<int> s;
// Insert element in the set
for (int i = 0; i < 10; i++) {
s.insert(i);
}
// Use lower_bound() function
// to find 5
set<int>::iterator it;
it = lower_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
fun();
// Stop timer
gettimeofday(&end, NULL);
// Calculating total time taken
// by the program.
double time_taken;
time_taken = (end.tv_sec
- start.tv_sec)
* 1e6;
time_taken = (time_taken
+ (end.tv_usec
- start.tv_usec))
* 1e-6;
cout << "Time taken by program is : "
<< fixed
<< time_taken << setprecision(6);
cout << " sec" << endl;
return 0;
}
輸出:
Time taken by program is : 0.000046 sec
程序來說明std::set::lower_bound():
// C++ program to illustrate
// std::lower_bound
#include <bits/stdc++.h>
#include <sys/time.h>
using namespace std;
// Function whose time is to
// be measured
void fun()
{
// Initialise the set
set<int> s;
// Insert element in the set
for (int i = 0; i < 10; i++) {
s.insert(i);
}
// Use set::lower_bound() function
// to find 5
set<int>::iterator it;
it = s.lower_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);
fun();
// Stop timer
gettimeofday(&end, NULL);
// Calculating total time taken
// by the program.
double time_taken;
time_taken = (end.tv_sec
- start.tv_sec)
* 1e6;
time_taken = (time_taken
+ (end.tv_usec
- start.tv_usec))
* 1e-6;
cout << "Time taken by program is : "
<< fixed
<< time_taken << setprecision(6);
cout << " sec" << endl;
return 0;
}
輸出:
Time taken by program is : 0.000039 sec
相關用法
- C++ std::set::upper_bound和std::upper_bound的區別用法及代碼示例
- C++ std::set_difference用法及代碼示例
- C++ std::set_intersection用法及代碼示例
- C++ std::set_union用法及代碼示例
- C++ std::search用法及代碼示例
- C++ std::search_n用法及代碼示例
- C++ std::swap()用法及代碼示例
- C++ std::strncmp()用法及代碼示例
- C++ std::sort()用法及代碼示例
- C++ std::stable_partition用法及代碼示例
- C++ std::stof用法及代碼示例
- C++ std::stol()、std::stoll()用法及代碼示例
- C++ std::string::append()用法及代碼示例
- C++ std::string::assign()用法及代碼示例
- C++ std::string::back()用法及代碼示例
- C++ std::string::clear用法及代碼示例
- C++ std::string::compare()用法及代碼示例
- C++ std::string::data()用法及代碼示例
- C++ std::string::erase用法及代碼示例
- C++ std::string::find_first_not_of用法及代碼示例
- C++ std::string::find_last_not_of用法及代碼示例
- C++ std::string::insert()用法及代碼示例
- C++ std::string::push_back()用法及代碼示例
- C++ std::string::resize()用法及代碼示例
- C++ std::swap_ranges用法及代碼示例
注:本文由純淨天空篩選整理自yash2040大神的英文原創作品 Difference between std::set::lower_bound and std::lower_bound in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。