order_of_key()是有序集的內置函數,該有序集是C++中基於策略的數據結構。基於策略的數據結構不是C++標準庫的一部分,但g ++編譯器支持它們。
有序集是g ++中基於策略的數據結構,可將唯一元素保持在已排序的順序中。它以log(n)複雜度執行由STL中的set數據結構執行的所有操作,還以log(n)複雜度執行兩個附加操作。
Two important operations that we can perform in these data structures:
- order_of_key: The number of items in a set that are strictly smaller than k
- find_by_order: It returns an iterator to the ith largest element
order_of_key()函數接受一個鍵,並返回有序集合中的元素數量,這些元素的數量嚴格小於作為參數傳遞給它的鍵。
例如,
Let us assume we have a set s : {1, 5, 6, 17, 88}, then :
s.order_of_key(6) : Count of elements strictly smaller than 6 is 2.
s.order_of_key(25) : Count of elements strictly smaller than 25 is 4.
與lower_bound()和distance()的比較
- 在C++中,我們有std::distance,它使用兩個迭代器並計算它們之間的距離。即它們之間的元素數量。它可以替代find_by_order,但對於有序集,其時間複雜度為O(n)。
- lower_bound也是一個選項,它花費log(n)的時間。它將迭代器返回到不少於k的第一個元素。但是由於它返回一個迭代器,所以我們永遠無法知道小於k的元素的索引或數量。
對於向量和線性數據結構,可以執行以下操作:
index = lower_bound(k) – myvector.begin() ;
但是由於set是基於樹的數據結構,因此我們無法執行此操作。
以下示例程序旨在說明order_of_key()的實現:
// CPP program to illustrate order_of_key()
// for policy based data structures
#include <iostream>
using namespace std;
// Important header files
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less
#include <iostream>
using namespace __gnu_pbds;
using namespace std;
// Declaring ordered_set
typedef tree<int, null_type, less<int>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
// Driver code
int main()
{
ordered_set mySet;
// Inserting elements to ordered_set
mySet.insert(5);
mySet.insert(2);
mySet.insert(6);
mySet.insert(4);
// count of elements less than 6
cout << "Count of elements less than 6::"
<< mySet.order_of_key(6) << endl;
// number 7 not in the set but it will show the
// index number if it was there in sorted array.
cout << "Count of elements less than 7::"
<< mySet.order_of_key(7) << endl;
return 0;
}
Count of elements less than 6::3 Count of elements less than 7::4
注:本文由純淨天空篩選整理自Jasbir Singh 3大神的英文原創作品 order_of_key() in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。