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食用字典序排列,
所以也可以食用迭代器找前驱、后继之类的东东。
(自建一颗平衡树)手写实在是再见了...

原文地址:https://www.cnblogs.com/jelly123/p/10390090.html