知识点 函数


在这里插入图片描述

一、概念

int 4个字节-231~231-1 231为10位数
long 与int相同(32位中相同,64位占8个字节-263~263-1)
long long -263~263-1 263-1 为20位数
2是素数
一:概念性的

1.树

(1)树的遍历
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
(2)二叉搜索树(二叉查找树)
或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
(3)完全二叉树
若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。
(4)AVL树
首先它有二叉查找树的所有特性,如果根节点有左子树,则左子树上的所有节点的值均小于根节点的值,如果根节点有右子树,则有字数上的所有节点的值均大于根节点的值。
每个节点都会有一个高度值,左子树的高度值和右子树的高度值差值应该小于规定的平衡值(一般为1)。
平衡树相对一般树多引入了一个高度的概念,即每个节点记录了以此节点为根节点的子树的高度,AVL树的插入和删除操作和二叉查找树几乎一模一样,唯一区别就是插入操作删除操作之后会有一个平衡操作。AVL树是一个带有平衡条件约束的二叉查找树。对于平衡树来说,往往是在插入和删除操作之后,导致原本的平横树失衡
(5)大顶堆,小顶堆
堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲堆其实就是利用完全二叉树的结构来维护的一维数组
按照堆的特点可以把堆分为大顶堆和小顶堆
大顶堆:每个结点的值都大于或等于其左右孩子结点的值
小顶堆:每个结点的值都小于或等于其左右孩子结点的值

2.前缀和

二维前缀和
在这里插入图片描述
ans=s[x2][y2]-s[x1-1][y2]-s[x2][y1]+s[x1-1][y1-1]

3.快速幂

int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

4.线性筛选

	for(int i=2;i<=N;i++){
		if(!xx[i]) prime[cnt++]=i;//存储cnt个素数
		for(int j=0;prime[j]*i<=N;j++){
			xx[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}

二、容器

1.vector

(1)容器初始化

头文件#include<string.h>
memset(dp,0,sizeof(dp));

初始化数组各项为0

#include<cstring>
int a[10][10];
memset(a,0,sizeof(a));

借鉴
(2)初始化size,并且设置初始值

vector<int> xx(10,1); //初始化了10个值为1的元素

或者

xx=vector<int>(N, -1);

或者

xx.resize(n);

(3)字符串反转reverse()

reverse(v.begin(),v.end());

(4)插入/删除元素

vector<int> v;
for(int i=1;i<=5;i++) v.push_back(i);
v.insert(v.begin(),10);v中有10 1 2 3 4 5
v.erase(v.begin());//删除第一个元素v中有1 2 3 4 5

插入/删除最后一个元素

xx.push_back(5)//最后插入5
xx.pop_back(); // 删除第一个元素

(5)lower_bound( )和upper_bound( )

auto it=lower_bound(v.begin(),v.end(),x);

二分查找范围[begin,end)查找到第一个大于等于x的数字,返回其位置,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

auto it=upper_bound(v.begin(),v.end(),x);

二分查找范围[begin,end)查找到第一个大于x的数字,返回其位置,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

int num[6]={1,2,4,7,15,34}; 
sort(num,num+6);    
int pos1=lower_bound(num,num+6,7)-num;  

2.map

(1)容器初始化为0

xx.erase(xx.begin(),xx.end());

(2)find函数

map<string,int> mp;
mp.find(x)==mp.end()//没找到,返回end();

用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明

3.stack

(1)容器清空

stack<int>().swap(xx);

(2)输出栈顶元素

int x=s.top();

4.queue

(1)容器清空

queue<int>().swap(q)

(2)输出队顶元素

int x=q.front();

queue和stack都没有clear()函数

5.set容器

(1)set集合中没有重复的元素
(2)set中的元素都是排好序的
(3)insert()插入,erase()删除集合中的元素

set<int> s;
s.insert(1);//插入1
s.insert(10);
s.insert(5);
s.erase(10);//删除10

(4)s.clear()删除所有的数据
(5)find()查找值对应的位置*(1)元素存在返回其对应的位置(2)不存在则返回尾指针,即最后一个元素的下一个位置*

if(s.find(5)!=s.end())	cout<<*s.find(5);
输出5

(6)s.empty()判断是否为空
求交集、并集、差集

vector<int> v1,v2,v3;  //交集v1,并集v2,差集v3
set_intersection(A.begin(),A.end(),B.begin(),B.end(),back_inserter(v1));  //求A、B的交集
set_union(A.begin(),A.end(),B.begin(),B.end(),back_inserter(v2));   //求A、B的并集
set_difference(A.begin(),A.end(),B.begin(),B.end(),back_inserter(v3));    //求A、B的差集

back_inserter()函数,这是iterator适配器,它能使元素被插入到作为实参的某种容器的尾部。
若要将结果存入set容器中

set_union(A.begin(),A.end(),B.begin(),B.end(),inserter( C1 , C1.begin() ) );

前四个参数依次是第一的集合的头尾,第二个集合的头尾。第五个参数的意思是将集合A、B取合集后的结果存入集合C中。
参考连接

6.deque

(1)队尾插入/删除

deque<int> d;  
    d.push_back(1);  
    d.push_back(2);  
    d.push_back(3);
  	d.pop_back();
  	//d中元素1 2

(2)队首插入/删除

d.push_front(0);  
//d中元素0 1 2;
d.pop_front();
//d中元素1 2

三、函数

sort函数

语法
sort(start,end,cmp)
参数
(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序

int a[5];//数组类
sort(a,a+5);//cmp用于规定排序的方法,可不填,默认升序

容器的或者字符串的

#include<algorithm>头文件
int cmp(int a,int b){
return a>b;//降序排列
}
vector<int> xx;//或者string xx;
sort(xx.begin(),ss.end(),cmp);//cmp处要求返回布尔值0或1
  // 使用cmp自动排序,从大到小,cmp 只能使用 大于 或 小于 进行返回 因为他底层的实现 原理是 快速排序 若使用小于等于或大于
等于进行判断 可能 会使指针 不断右移 发生段错误

max函数

头文件:#include< algorithm >
语法:

int c=max(a,b);

c=a与b中最大值

isdigit函数(没啥大用)

头文件:
  C——#include<ctype.h>
  C++——#include<cctype>

函数定义:int isdigit(char c)
返回值:
  若参数c为阿拉伯数字0~9,则返回非0值,否则返回0。
9.cout保留x位小数

#include <iomanip>
cout<<fixed<<setprecision(2)<<d;

fill函数

若想将MAX=99999赋值给一个数组
#include< algorithm >

int cost[20001];
	fill(cost,cost+20001,MAX);

memset函数

#include<memory.h>或<string.h>
初始化int只能初始化0和-1,所以要是想初始化1,修改数组类型bool再初始化

char data[10];
memset(data, 1, sizeof(data));    
memset(data, 0, sizeof(data));    
当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值

hypot()求直角三角形斜边长,直角边长x,y

double hypot(double x, double y);

double d=hypot(x, y);

向上或者向下取整

使用floor函数。floor(x)返回的是小于或等于x的最大整数。
如: floor(10.5) == 10 floor(-10.5) == -11
使用ceil函数。ceil(x)返回的是大于x的最小整数。
如: ceil(10.5) == 11 ceil(-10.5) ==-10

if(k & 1)

判断是否为奇数数。如果为真,则为奇数,为假则为偶数。
&符号代表 按位与,1的二进制最后一位为1,其余为零。如果一个数为奇数,那么最后一位必为1,其余位必为0,所以得出结果为1。如果是偶数的话,最后一位必然为0,其余位与0与运算必为0,所以结果为0,这样就可以起到判断奇数偶数的效果。

~i

for(int i=n;~i;i--)

因为-1取反=0,所以i>=0可以写成~i

sort

头文件
#include < algorithm >
#include< functional >//因为用了greater()

  sort(a+1, a+1+n,greater<int>());//从大到小排序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值