• qbxt Day 3 STL 学习笔记


    Day 3 学习笔记 STL 模板库


    一、结构体

    结构体是把你所需要的一些自定义的类型(原类型、实例(:包括函数)的集合)都放到一个变量包里。
    然后这个变量包与原先的类型差不多,可以开数组,是一种数据类型。

    1.成员组成

    1.成员实例,就是原先的类型。
    2.成员函数,可以是比较函数,可以和结构体外的函数重名,定义域(放的地方)不同,值域(作用)可能相同。

    2.函数的声明与定义

    函数声明:声明有这样一个函数,
    在下面定义这个函数,避免相互调用的时候发生没有编译的情况。
    函数定义:让机器知道这个函数有什么作用。
    举个栗子:

    #include <bits/stdc++.h>
    using namespace std;
    struct gry{
    	int RP,EP;
        int RP1();//声明
    }gry1;
    int gry::RP1()
    {
    	return RP;
    }
    

    构造函数:
    初始化结构体元素。

    struct noip{
        int rp,ep;
    };
    struct gry{
        gry()//←就是构造函数,可以先声明,再调用
        {
            tql.RP=tql.EP=0;
        }
    	noip tql;
    }gry1();
    

    gry1()的括号是调用的关键.

    3.运算符重载

    1.作用

    定义加减乘除取模比较...

    2.方式

    1.友元函数
    struct ???{
        ?? a,?? b;
    	friend bool/int/??? operator 运算符(??? x,??? y){
            return ???.a运算符???.b;
    }
    
    2.正常模式(指针)
    struct ???{
        ?? a,?? b;
    	bool/int/??? operator 运算符(??? y) const{
            return this->a运算符???.b;
    }
    
    3.在外声明
    bool/int/???& operator 运算符(??? y)
    {
            return ???.a运算符y.b;
    }
    

    差不多就这三种最常用。
    这玩意用在哪里呢?还记得STL里面的sort和priority_queue吗?里面会用到大量的大于小于号之类的。如果不重载,编译就炸了。


    终于铺垫完了。(累)

    二、STL的食用

    1.常用

    1.pair

    1.make_pair(typename first,typename second)

    返回一个pair。

    2.性质

    先比较first,再比较second,已经重载比较运算符。

    2.stack 栈

    操作:
    stackname.push(typename a)
    把a压进栈
    stackname.pop(typename a)
    弹出栈顶
    stackname.empty()
    空就返回true。
    stackname.top()
    返回栈顶元素。
    其实没什么价值,模拟起来也很简单。

    struct stack{//手动模拟
        stack(){a=vector<int>();n=0;}
        vector<int>a;
        int n;
        void pop(){n--;a.pop_back();}
        int top(){return a.at(n);}
        bool empty(){return n>0;}
        void push(int num){a.push_back(num);n++;}
    };
    

    3.vector 动态数组

    就是长度是数组元素个数的数组。
    操作:
    push_back(tymename a)把a放进数组尾。
    pop_back()弹出末尾元素。
    ......
    模拟一下?先学指针!(dalao请跳过)
    指针是什么?就是一个地址。
    理解一下就是指向一个元素的地址叫指针...
    说白了就是一个地址。

    int *p=&a;//定义p存储a的地址。&a意思是变量a的地址。
    //----------------------------------------------
    int *p;p=&a;//与上面的等价
    p++;//p挪到下一个int地方
    (*p)++;//p所指的地方++
    

    那么如果我们在结构体里面套用自己类型的变量,就会发生错误,但是如果套用自己类型变量的地址...就形成了一个动态的数据结构。
    动态规划你的空间:new和delete。
    举个例子(栈):

    struct my_stack{
        int num;
        mystack *next;
        mystack *dis;
    };
    

    五、bitset

    意义就在于修改某位的二进制。

    六、queue 队列

    先进先出
    .push(typrname a)一样的
    .pop()弹出队头
    .front()返回队头元素值
    .size()返回队列长度
    .empty()返回空?1:0

    七、优先队列(二叉堆)

    详见二叉堆
    别忘了重载运算符!否则会死在这了...

    八、set 集合

    迭代器iterator,食用与指针类似。
    .upper_bound(num)
    返回一个比num小的前驱(迭代器)
    .lowwer_bound(num)
    返回一个比num大的后继(迭代器)
    .erase(num)
    删除元素
    set类似数学上的集合,真·去重。(unique伪去重)
    里面自建一颗红黑树,会进行排序和去重(平衡树性质),
    multiset是多重集合,自建堆一个。

    九、map 映射

    (要求有小于号重载!)
    map在python中被称之为dict(dictionary).

    用法:

    map<typename,typename>qwq;
    指的是qwq内部有一个pair,第一个是key(关键字),第二个是value(值),数学函数类比一下。
    qwq[a],指的就是map:qwq里a或者字典序第一个对应的value值。
    调用迭代器时map的时候key食用字典序排列,
    所以也可以食用迭代器找前驱、后继之类的东东。
    (自建一颗平衡树)手写实在是再见了...

  • 相关阅读:
    洛谷 P4861 按钮
    《情人》
    bzoj1019: [SHOI2008]汉诺塔(dp)
    hdu5698瞬间移动(组合数,逆元)
    poj Code(组合数)
    组合数 牛顿二项式定理 杨辉三角
    8.22 NOIP 模拟题
    codevs2495 水叮当的舞步(IDA*)
    codevs 2541 幂运算(迭代加深搜索)
    较复杂搜索,剪枝
  • 原文地址:https://www.cnblogs.com/jelly123/p/10390090.html
Copyright © 2020-2023  润新知