STL中的平衡二叉树(multiset)

STL中的平衡二叉树(multiset)

运用场景:有时需要在大量增加,删除数据的同时,还要进行大量数据的查找

希望增加数据,删除数据,查找数据都能在log(n)复杂度完成。

排序+二分查找显然不可以,因加入新数据就需要重新排序

可以使用“排序二叉树”数据结构存放数据,体现在STL中,就是以下四种“排序他容器”

multiset set multimup map

multiset < T > st;
  • 定义了一个multiset变量st,st里面可以存放T类型的数据,并且能自动排序。开始st为空。
  • 排序规则:表达式“a<b"为true,则a排在b前面。
  • 可用st.insert添加元素,st.find 查找元素,st.erase删除元素,复杂度都是log(n)

用例:

#include <iostream>
#include <cstring>
#include <set>//使用multiset和set需要此头文件
using namespace std;
int main()
{
    multiset <int>st;
    int a[10]={1,14,12,13,7,13,21,19,8,8};
    for(int i=0;i<10;++i)
        st.insert(a[i]);//插入的是a[i]的复制品
    multiset<int>::iterator i;//迭代器,近似指针
    for(i=st.begin();i!=st.end();++i)
        cout<<*i<<",";
    cout<<endl;
    i=st.find(22);//查找22,返回值是迭代器
    if(i==st.end())//找不到则返回值为end()
        cout<<"not found"<<endl;
    st.insert(22);//插入22
    i=st.find(22);
    if(i==st.end())
        cout<<"not found"<<endl;
    else 
        cout<<"found:"<<*i<<endl;
    //找到则返回指向找到的元素的迭代器
    i=st.lower_bound(13);
    //返回最靠后面的迭代器it,使得[begin(),it)中的元素都在13前面,复杂度log(n).
    cout<<*i<<endl;
    i=st.upper_bound(8);
    //返回值最靠前的迭代器it ,使得[it,end())中的元素都在8后面,复杂度log(n).
    cout<<*i<<endl;
    st.erase(i);//删除迭代器i指向的元素,即12
    for(i=st.begin();i!=st.end();++i)
        cout<<*i<<",";
    return 0;
}
multiset上的迭代器

multiset < T> ::iterator p;

(p是一个变量名,可以随便换)

  • p是迭代器,相当于指针,可用于指向multiset中的元素。访问multiset中的元素要通过迭代器。

  • 与指针的不同

    multiset上的迭代器可++,–,用!=和==比较,不可比大小,不可加减整数,不可相减。

  • st.begin()返回值类型为multiset< T>::iterator,

    是指向st中的头一个元素的迭代器

  • st.end()返回值类型为multiset< T >::iterator,

    是指向st中的最后一个元素后面的迭代器

  • 对迭代器++,其就指向容器中下一个元素,–则令其指向上一个元素。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值