算法笔记c++入门(查漏补缺)

本文是针对我个人对于c++的薄弱点做的笔记,文中出现了错误希望大家能够理解,并且指出。

1.变量类型
int:取值范围: − 2 31 -2^{31} 231~ 2 31 − 1 2^{31}-1 2311
大致范围: − 2 × 1 0 9 -2\times10^{9} 2×109~ 2 × 1 0 9 2\times10^{9} 2×109
2.转义字符
/0代表空字符NULL,其ASCII码为0。
3.符号常量和const常量

#define pi 3.14
const doubloe pi = 3.14;
推荐使用const
#include<cstdio>
#define cal(x) (x * 2 + 1)
int main(){
	int a = 1;
	printf("%d",cal(a + 1));
}
输出结果:4
注意:为什么不是5,因为宏定义只是将替换的部分原封不动替换,导致cal(a + 1)实际上是(a + 1 * 2 + 1= 5;
#define cal(x) ((x) * 2 + 1)) //正确

4.赋值表达式

n /= m + 1;等价于 n = n / (m + 1);

5.scanf函数的使用

scanf("格式控制",变量地址);
scanf("%c",&c);
scanf("%s",str);//数组名称本身就代表这个数组第一个元素的地址,所以不用再加取地址符
scanf("%d:%d:%d",&hh,&mm,&ss);
注意:除%c外,scanf对其他格式符的输入是以空白符(即空格,换行)为结束标志的。

6.三种实用的输出格式
(1)%md
%md可以是不足m位的int数据以m为进行右对齐输出。如果位数超过m,则保持原样
(2)%0md
与%md唯一的不同是不足的位数用0补齐
(3)%.mf
浮点数保留m位小数输出
7.常用的math函数

fabs(double x) 取绝对值
floor(double x) ceil(double) 向上向下取整
log(double x)以自然对数为底的对数
round(double x) 四舍五入

8.switch语句

switch(表达式){
	case 常量表达式 1:
		......
		break;
	case 常量表达式 2:
		......
		break;
	case 常量表达式 3:
		......
		break;
	default:
		......
}	

9.数组的赋值

int a[10];//数组元素的值是随机数
int a[10] = {1,2,3};//后面没有赋值的元素默认为零
给数组元素赋值为零可以这样做:
int a[10] = {0};
int a[10] = {};
开辟的数组大小较大需要定义在主函数外面,因为函数内部申请的局部变量来自于栈,允许申请的空间小,函数外申请的全局变量来自于静态存储区,允许申请的空间较大,

10.memset–对数组中每一个元素赋相同的值

memset(a,-1,sizeof(a))//注意只能赋值-1和0
因为memset、是按照字节赋值的而-10的补码都是全零和全1
若要赋值其他数值可以用fill(a,a+n,1);
fill函数它的原理是把那一块单元赋成指定的值;

11.strcmp strcpy strcat函数
strcmp:按照字典序排序,前一个大于后一个返回一个整数,等于返回零,小于返回一个负数;
strcpy :字符串复制将后一个复制给前一个;
strcat:字符串拼接;
12.sscanf和sprintf函数

scanf函数可以理解成:
scanf(screen,"%d",&n);//其中screen代表屏幕
scanf的输入其实就是把screen的内容以%d的格式传输到n中,printf则是将n以%d的格式输出到屏幕;
理解这个我们就很好理解下面两个函数了
sstring只是将screen换成了字符数组
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
	char str[10] = "123";
	sscanf(str,"%d",&n);
    printf("%d",n);
}
输出结果:
123

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n = 12;
	char str[10];
	sprintf(str,"%d",n);
    printf("%s",str);
}
输出结果:
12

13.以数组作为函数参数

数组作为参数时,在函数中对数组元素的修改就等同于是对原数组元素的修改,因为数组名就是该数组的首地址。
不过虽然数组可以作为参数,但是却不允许作为返回类型出现,如果要返回数组,则只能将想要返回的数组作为参数传入。

14.指针

1.指针是一个unsigned类型的整数
2.指针变量的定义
int *p;//int* 才是类型p是变量名
注意:
int* p1,p2;//p1是指针变量,p2是int变量
int* p1,*p2;
a + i 等价于 &a[i];
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[10];
    for(int i = 0; i < 10; i++) scanf("%d",a + i);
    for(int i = 0; i < 10; i++) printf("%d",*(a + i));
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[10] = {1,2,3,4,5};
    int *p = a;
    int *q = &a[2];
    printf("%d\n",p);
    printf("%d\n",q);
    printf("%d",q - p);
}
p和q的具体数值和运行环境有关,但是他们的结果一定是相差8然后根据int4个字节,所以q-p等于8/4 = 2;
void swap(int *a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
通过指针作为参数实现交换函数;
错误写法1:
void swap(int *a,int *b){
    int *temp = *a;
    *a = *b;
    *b = *temp;
}
错误原因:temp没有初始化,可能指向系统工作区间
更正:
void swap(int *a,int *b){
	int x;
    int *temp = &x;//随机给temp一个地址
    *temp = *a;
    *a = *b;
    *b = *temp;
}
错误写法2:
void swap(int *a,int *b){
    int *temp = a;
     a = b;
     b =  temp;
}
在函数里改变了int *a,*b的地址不能返回到main函数,因为他们是副本,是形参。

15.引用

引用的含义:给变量起了一个别名,对引用变量的操作就是对原变量的操作。
上一点中错误解法二的更正就可以用到引用了
#include<bits/stdc++.h>
using namespace std;
void swap(int * &a,int * &b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main(){
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;
    swap(p1,p2);
    cout << *p1 << *p2 << endl;
}
在主函数中调用需要注意:
不能直接调用swap(&a,&b);//因为常量a,b不可以使用引用

16.结构体的使用

struct node{
    node n;//错误
    node *p;//指向结构体的指针变量
};
struct node{
   int id;
   node *next;
}n,*p;
访问结构体元素:
n.id
n.next
(*p).id
p->id
注意:.->都是成员选择只是.前面的是对象->前面的是指针;

17.结构体的构造函数

简化写法:
node(int id):id(id){}

18.getline函数

读入一整行字符串中间有空格
string str;
getline(cin,str);
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值