📜  C++中的find_by_order()(1)

📅  最后修改于: 2023-12-03 15:29:53.566000             🧑  作者: Mango

C++中的find_by_order()介绍

C++中的find_by_order()是一个使用方便的函数,可用于从有序的数据结构(例如set、map等)中查找特定排名的元素。该函数具有O(log n)的时间复杂度,使得其在处理大型数据集时表现优异。

使用前提

在使用find_by_order()函数之前,需要使用STL库中提供的有序容器,如set和map。 此外,需要包含头文件#include <ext/pb_ds/assoc_container.hpp>#include <ext/pb_ds/tree_policy.hpp>

用法示例

以下是使用find_by_order()函数的示例。

#include<iostream>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
int main()
{
     ordered_set s;
     s.insert(1);
     s.insert(3);
     s.insert(4);
     s.insert(10);
     s.insert(15);

     // find_by_order()函数查找排名为2的元素,返回值为指向该元素的迭代器
     auto it = s.find_by_order(2);
     cout << *it << endl; //输出 "4"
     
     // order_of_key()函数查找值为10的元素的排名
     cout << s.order_of_key(10) << endl; //输出 "3"
     
     return 0;
}
函数说明

find_by_order()函数的定义如下:

template<typename Key,typename Mapped,typename Cmp_Fn,typename Tag,template<typename,typename,typename,typename,typename> class Node_Update>
class tree;
template<typename T,typename Cmp_Fn = std::less<T>,typename Allocator=std::allocator<T>>
class ordered_set;
template<typename Key,typename Mapped,typename Cmp_Fn=std::less<Key>,typename Allocator=std::allocator<std::pair<const Key,Mapped>>>
class ordered_map;

template<typename Key,typename Mapped,typename Cmp_Fn=std::less<Key>,typename Allocator=std::allocator<std::pair<const Key, Mapped>>,
    typename Node_Update=tree_order_statistics_node_update>
class tree
{
    public:
        // Returns an iterator pointing to the k-th smallest element in the ordered set. 
        iterator find_by_order(size_type k) const;

        // Returns the number of keys strictly smaller than key. 
        size_type order_of_key(const key_type& k) const;
};

此外,如果您使用的是set而不是ordered_set,则需要应用类似以下方式:

#include<iostream>
#include<set>
using namespace std;

int main()
{
     set<int> s;
     s.insert(1);
     s.insert(3);
     s.insert(4);
     s.insert(10);
     s.insert(15);

     //先将set转换为vector
     vector<int> v(s.begin(), s.end());

     // 使用nth_element算法进行排名查找
     nth_element(v.begin(), v.begin()+2, v.end());

     cout << v[2] << endl; //输出 "4"

     return 0;
}
适用场景

C++中的find_by_order()函数适用于需要在有序数据结构中查找特定排名元素的场景。 例如,可以在一个字符串集合中查找出现次数第k多的字符串,或者查找第k大的整数等。