C++STL标准库学习笔记(三)multiset

目录

STL中的平衡二叉树数据结构

前言:

正文

介绍:

1.1 multiset用法

1.2 multiset上的迭代器

后记:


STL中的平衡二叉树数据结构

前言:

        在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来。

正文

介绍:

        有时需要在大量增加,删除数据的同时,还需要大量数据的查找

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

        排序+二分查找显然不行,因为加入新数据就要重新排序。

        在这个时候!我们就可以使用“平衡二叉树”数据结构存放数据,体现在STL中就是以下四种“排序容器”

        multiset set multimap map

        英语课:set:集合

        反正我们只管用就行了,具体实现应该可以参考《STL源码剖析》

        从这里开始就需要有一定程度的数据结构和C++面向对象的知识了,如果忘记的话可以去复习一下,当然,这里我们只要会用就行了,不需要特别深的理解。

1.1 multiset用法

        使用前记得#include<set>

        multiset<T> st;

        定义了一个叫multiset变量st,st里面可以存放T类型的数据(自定义元素也行),并且能够自动排序。开始st为空。

        排序规则:表达式“a < b”为true,则a排在b前面

        可用st.insert添加元素,st.find查找元素,st.erase删除元素,复杂度都是log(n)(还有好多函数,这个就要自己去研究了,以后有机会也会来补充的)

1.2 multiset上的迭代器

        multiset<T>::iterator p;

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

        与指针的不同:

        multiset上的迭代器可++,--,用!=和==比较,不可比大小,不可加减整数,不可相减。(指针就能这样操作,可以用来算长度啥的)

        multiset<T> st;

        st.begin() 返回值类型为 multiset<T>::iterator,是指向st中的头一个元素的迭代器。

        st.end() 返回值类型为 multiset<T>::iterator,是指向st中的最后一个元素后面的迭代器。(有没有一种既视感,就是[ st.begin(), st.end() )和前面sort的范围很像,不过估计是因为迭代器不能比较大小,为了方便判断全部遍历过了就让st.end()指向了最后一个的后面,访问到st.end()时刚好退出)

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

样例:

#include<iostream>

#include<cstring>

#include<set>//使用multiset和set需要

using namespace std;

int main(int argc, char const *argv[])

{

    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<<",";//输出:1,7,8,8,12,13,13,14,19,21,

    }

    cout<<endl;

    i = st.find(22);//查找22,返回值是迭代器

    if (i == st.end())//查找不到则返回值为end()

    {

        cout<<"Not Found"<<endl;//输出:Not Found

    }

    st.insert(22);//插入22

    i = st.find(22);

    if (i == st.end())

    {

        cout<<"Not Found"<<endl;

    }

    else

    {

        cout<<"Found:"<<*i<<endl;//输出:Found:22

    }//找到则返回指向找到的元素的迭代器



    i = st.lower_bound(13);

    //返回最靠后的迭代器it,使得[begin,it)中的元素

    //都在13前面,复杂度log(n)

    cout<<*i<<endl;//结果:13

    i = st.upper_bound(8);

    //返回最靠前的迭代器it,使得[it,end())中的元素

    //都在8后面,复杂度log(n)

    cout<<*i<<endl;//结果:12

    st.erase(i);//删除迭代器i指向的元素,即12

    for ( i = st.begin(); i != st.end(); i++)

    {

        cout<<*i<<",";//输出:1,7,8,8,13,13,14,19,21,22,

    }

   

    return 0;

}

程序中部分重要的地方单独拎出来强调:

        i = st.find(22);

        作用是查找22,返回值是迭代器

        i = st.lower_bound(13);

        返回最靠后的迭代器it,使得[begin,it)中的元素

        都在13前面,复杂度log(n)

        i = st.upper_bound(8);

        返回最靠前的迭代器it,使得[it,end())中的元素

        都在8后面,复杂度log(n)

        st.erase(i);

        删除迭代器i指向的元素

后记:

        从这里开始就有数据结构那味了,如果平衡二叉树忘记的话,记得去看看(虽然我觉得逻辑理解了,会用就行)。另外,可以看见这里的用法和前面sort,binary_search之类也有相似之处,估计学完一部分STL标准库内容,其他内容看到函数名就会用了。感谢大家读到这里,祝大家健康快乐吉祥如意恭喜发财学业有成早生贵子年年有余,以及头发茂密,下篇博客再见拜拜。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ STL(标准模板库)是C++标准库的一部分,提供了一组通用的数据结构和算法。STL标准库中文文档涵盖了STL的各个部分,包括容器(container)、迭代器(iterator)、算法(algorithm)等。 STL中文文档可以帮助开发者更好地理解和使用STL库,具体内容包括: 1. 容器:STL库提供了多种容器类型,如vector、list、map等,这些容器提供了不同的数据存储和操作方式。文档会介绍每种容器的特点、用法和示例代码。 2. 迭代器:迭代器是与容器配合使用的一种机制,通过迭代器可以访问和遍历容器中的元素。文档会介绍迭代器的种类、使用方法以及常见操作。 3. 算法:STL库提供了众多的算法,如排序、查找、复制等,可以在不同的容器上进行操作。文档会详细介绍每个算法的功能、参数和使用示例。 4. 函数对象:STL库提供了函数对象机制,可以将函数或函数对象作为算法的参数,用于执行特定的操作。文档会介绍函数对象的定义和使用方式。 STL标准库中文文档的作用主要有两个方面:一是帮助新手学习和理解STL库的使用方法,提供了丰富的示例和解释;二是方便开发者在实际项目中使用STL库,对于算法和容器的选择和使用提供了参考和指导。 总之,STL标准库中文文档是一份重要的资料,对于学习和使用C++的开发者来说都具有很大的价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值