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

📅  最后修改于: 2023-12-03 14:59:48.330000             🧑  作者: Mango

C++ 中的 find_by_order()

在C++的STL库中,有一个称为set的数据结构,它可以用来存储一组互不相同的元素,并支持快速地查找、插入和删除一个元素。其中,set中的元素默认以升序排列。

set中有一个成员函数find(),可以用来查找指定的元素是否存在,如果存在,则返回指向该元素的迭代器;如果不存在,则返回set::end()。

除了find()之外,set还有一个名为find_by_order()的函数,可以用来查找set中第k小的元素,并返回一个指向该元素的迭代器。

具体来说,find_by_order(k)返回一个指向set中第k小的元素的迭代器,如果k越界,则返回set::end()。在使用find_by_order()函数之前,需要在程序中加入以下代码:

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

#define int long long

template<class T>
using Tree=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    Tree<int>s;
    return 0;
}

其中,Tree是一个定义好的模板,可以根据需要进行修改。T是指set中元素的类型,可以为整型、浮点型、字符型、字符串等等。

下面,我们来看一个例子,使用find_by_order()函数查找set中第k小的元素:

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

#define int long long

template<class T>
using Tree=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    Tree<int>s;
    s.insert(1);
    s.insert(3);
    s.insert(4);
    s.insert(10);
    s.insert(33);

    // 查找set中第2小的元素
    auto it=s.find_by_order(2);
    if(it!=s.end())
    {
        cout<<"第2小的元素为:"<<*it<<endl;
    }
    else
    {
        cout<<"不存在第2小的元素。"<<endl;
    }

    return 0;
}

输出结果为:

第2小的元素为:3

从上面的例子可以看出,使用find_by_order()函数十分方便,可以帮助我们快速地查找set中某个位置的元素,非常适用于需要高效地查找集合中第k小的元素的场合。