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++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。