C++入门基础知识

CPP入门基础知识 1.命名空间 2.C++基本的输入输出流 3.重载(C++为什么支持重载?)  4.C++缺省参数  5.指针和引用(概念、使用方法、做参数、做返回值的作用,指针和引用的区别) ——————————————————————————————————————————————————————————————————— 1.命名空间 http://blog.youkuaiyun.com/passball 阅读详情

目录

目录

一.命名空间

1.namespace的定义

2.命名空间的使用

二.C++输入和输出

三.缺省参数

 三.函数重载

四.引用

1.引用的定义和概念

2.引用的特性

3.引用的使用

4.引用中const引用

五.指针与引用的异

六.inline(内联函数)

七.nullptr关键字


一.命名空间

在C/C++中,我们有时候忘记已经被收入到头文件的函数名和关键字,却在运用时都把它们放在全局作用域里,可能就会导致很多冲突。为了避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题。

例如以下代码。

#include<stdio.h>
#include<stdlib.h>
int rand=10;
int main()
{
printf("%d\n",rand);
return 0;
}
//该代码会编译错误:error C2365:"rand":重定义;

在学习C语言的时候,我们知道rand函数是包含在头文件#include<stddlib.h>中,该代码中的变量rand和函数rand重名了。为了解决这种问题,C++提出了关键字namespace。

1.namespace的定义

要使上面的代码运行成功就要使用到namespace关键字。

#include<stdio.h>
#include<stdlib.h>
namespace MY
{
int rand=10;
}
int main()
{
printf("%d\n",MY::rand);
return 0;
}

由上面的代码可以看出

(1.namespace的用法:namespace+命名空间的名字,然后再接一对{}即可,{}中即为命名空间中的成员。命名空间中可以定义变量/函数/类型等。

(2.namespace本质是定义出另一个域,这个域跟全局变量各自独立,不同的域可以定义同名变量,所以上面代码中rand不冲突了。

(3.C++中的域有函数局部域,全局域,空间命名域,类域;域影响的是编译时语法的查找一个变量/函数/类型出处(声明或定义)的逻辑。在C语言中我们学习到的局部域和全局域还会影响变量的生命周期,但是值得注意的是命名域和类域不影响变量的生命周期。

(4.namespace只能定义在全局,但可以嵌套调用。

#include<stdio.h>
#include<stdlib.h>
namespace MY
{
int rand=10;
namespace new1
{
int rand=30;
}
}
int main()
{
printf("%p\n",rand);//这里默认访问的是全局的rand函数指针
printf("%d\n",MY::rand);//这里指定new命名空间中的rand
//输出10
printf("%d\n",MY::new1::rand);//这里指的是new命名空间中new1命名空间中的rand
//输出30
}

(5.项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。

例如,在项目工程中Stack.c和Test.c文件中都定义了一个namespace new的命名空间,相当于在

把两个文件中namespace new中的成员和并在一起。

(6.C++标准库都放在一个叫std的命名空间中。这个命名空间中包括cout(输出)、cin(输入)等。

2.命名空间的使用

编译查找一个变量声明/定义时,默认只会在局部和全局查找,不会再命名空间中查找,所以上面虽然在命名空间中定义了rand变量,但是编译器查找不到,程序就会报错。所以我们要使用命名空间中定义的变量/函数,有三种方式:

(1.指定命名空间访问。上面代码中的MY::rand。

(2.using将命名空间中某个成员展开,项目中经常访问的且不存在冲突的成员推荐。

所以可以将上面的代码改成

#include<stdio.h>
namespace MY
{
	int ret = 10;
	int rand = 20;
}
using MY::rand;//展开命名空间MY的成员rand
//using namespace MY;//展开命名空间的全部成员
int main()
{
	printf("%d\n", rand);//如果存在头文件#include<stdlib.h>时即使展开了rand也会报错
//因为编译器不知道rand是哪个rand
	printf("%d\n", MY::ret);
	return 0;
}

(3.展开命名空间中全部成员,项目不推荐,冲突风险很大。

二.C++输入和输出

1.<iostream>是标准的输入、输出流库。vs中该库也包含printf、scanf,其他编译器可能报错。

2.std::cout是ostream类的对象,它主要面向窄字符的标准输出流;std::cin是istream类的对象,它主要也是面向窄字符的标准输入流。

3.std::endl是一个函数,流插入输出时,相当于插入了一个换行符加刷新缓冲区。

4.<<是流插入运算符,>>是流提取运算符。

以上这四点的运用如下图

#include<iostream>
using namespace std;
int main()
{
	int a;
	cin >> a;//输入23
	cout << a << endl;//输出23
}

5. C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的)。

6.cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std的命名空间中。如上面的代码中using namespace std;一般训练的时候可以这么写,但实际项目开发中不建议。

三.缺省参数

之前在学习C语言的时候发现函数形参的变量如果在调用在这个函数的时候没有写实参,都会报错。而缺省参数就是在声明和定义和函数时为函数的参数指定一个缺省值。当我们在调用该函数的时候,即使没有写实参,也会采用该形参的缺省值,如果指定了实参,则应用实参,缺省参数分为全缺省和半缺省参数。

1.全缺省就是所有形参都指定缺省值,半缺省就是部分形参给缺省值(不是一半给一半不给)但半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

2.调用带缺省函数时,C++会从左往右依次给实参,不能跳跃给实参。

3.函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省
值。

#include<iostream>
using namespace std;
void func(int a = 10, int b = 20, int c = 30)
{
	cout << "a=" << a << " ";
	cout << "b=" << b << " ";
	cout << "c=" << c << endl;
}
void func1(int a, int b = 30, int c = 40)
{
	cout << "a=" << a << " ";
	cout << "b=" << b << " ";
	cout << "c=" << c << endl;
}
int main()
{
	func();
	func(30,40, 50);
	func1(10);
	func1(10, 50);
}

结果如下:

 三.函数重载

C++支持在同一作用域中出现的同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。而C语言是不支持同一作用域存在同名函数的。

1.可以重载的函数只要满足其中一个都可以。

(1)参数类型不同。如int  Add(int x,int y)和double Add(double x,double y)构成重载。

(2)参数个数不同。如void f()和void f(int a)构成重载。

(3)参数类型顺序不同。如void f(int a,char b)和void f (char b,int a)构成重载。

但注意函数的返回值不能作为重载的条件,因为调用时无法区分。

上面我们学习了缺省参数,那么void f()和void f(int a=10)构成重载吗?它们的参数个数不同当然是构成重载的 ,但是当函数调用方式为f()时,会存在歧义,编译器不知道要调用哪个。

四.引用

1.引用的定义和概念

引用其实就是给变量取别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一个内存空间。定义:类型&引用别名=引用对象。

​​​​int main()
{
	int a = 10;
	int& ra = a;
	int& rb = ra;
	cout << &a << endl;
	cout << &rb << endl;
	cout << &ra << endl;
	a++;
	cout << "a=" << a << " ";
	cout << "b=" << rb << " ";
	cout << "c=" << ra << endl;
}

运行结果如下:

在上面的结果中我们可以看到变量a、ra、rb它们的地址是相同的,这就表明它们三个都指向同一块空间,所以当a的值变化时,ra、rb的值也变化了。

2.引用的特性

(1.引用在定义时必须初始化。

(2.一个变量可以有多个引用。

(3.引用一旦引用了一个实体,在不能引用其他实体。

int main()
{
	int a = 10;
	//int& ba;//编译错误:ba必须初始化
	int& ba = a;
	int c = 20;
	//int& ba = c;//编译错误:ba重定义;多次初始化(根据第三点)
	cout << "a=" << a << " ";
	cout << "b=" << ba << " ";
	cout << "c=" << c<< endl;
}

3.引用的使用

(1.引用实践中主要是引用传参和引用做返回值中减少拷贝提升效率和改变引用对象的同时改变被引用对象。如在函数传参的时候,在形参中引用,即是实参的别名。和指针传参的功能类似。

(2.指针和引用在实践中相辅相成,功能有重叠性,但各有特点,互相不可替代。但是C++引用定义后不能改变指向。如不能像指针一样在链表中指向下一个地址等。

void swap1(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
void swap2(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 10, b = 30;
	swap1(&a, &b);
	cout << a << " " << b << endl;
	int c = 20, d = 40;
	swap2(c, d);
	cout << c << " " << d << endl;
}

但是如果把函数的返回值直接用来运算能不能运行成功呢?如以下代码。

int f(int* a,int n)
{
	return a[n - 1];
}

int main()
{
	int a[] = { 1,3,4,5 };
	int n = sizeof(a) / sizeof(a[0]);
	f(a, n) += 10;
    cout << f(a, n) << endl;
    return 0;
}

答案是不可以的,为什么呢?

在学习c语言的时候我们知道在函数运行结束后编译器会自动销毁空间,所以我们返回的只是它的值,并没有它那块地方的地址。而如果把函数改成int &f(int *a,int n)就可以表示为给a数组中的n-1的下标的元素取别名,所以在f(a,n)中用的是那个元素的别名。

插个题外话。

如果把定义一个变量,把a[n-1]的值给变量,程序还能运行成功吗?

int& f(int* a,int n)
{
	int ret = a[n - 1];
	return ret;
}
int main()
{
	int a[] = { 1,3,4,5 };
	int n = sizeof(a) / sizeof(a[0]);
	f(a, n) += 10;
	int tmp = f(a, n);
	cout << tmp << endl;
}

答案是可以成功,但是它并没有改变f(a,n)的值。

 上面我们提到了变量出了函数就会销毁,而上面直接返回函数的是因为原本那个数组就存在并不会销毁,而那个变量出函数运用时编译器就找不到它的空间了。

二级指针也可用引用代替。例如链表中的。

typedef struct ListNode
{
int val;
struct ListNode* next;
}LTNode, *PNode;
// 指针变量也可以取别名,这⾥LTNode*& phead就是给指针变量取别名
// 这样就不需要⽤⼆级指针了,相对⽽⾔简化了程序
//void ListPushBack(LTNode** phead, int x)
//void ListPushBack(LTNode*& phead, int x)
void ListPushBack(PNode& phead, int x)
{
PNode newnode = (PNode)malloc(sizeof(LTNode));
newnode->val = x;
newnode->next = NULL;
if (phead == NULL)
{
phead = newnode;
}
else
{
//...
}
}

4.引用中const引用

在C语言中我们学过const的用法——用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。

(1.可以引用一个const对象,但是必须用const引用。const引用也可以引用普通变量,因为对象的访问权限在引用过程中可以缩小,但不可以放大。

(2.不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场
景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对
象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥
就触发了权限放⼤,必须要⽤常引⽤才可以。所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象。

int main()
{
	const int a = 10;
	//int &ra=a;//编译错误,权限变大了。
	const int& ra = a;

	int b = 10;
	const int& rb = b;//这里的引用是对b权限的缩小。
	int c = 10;
	const int& rc = c * 3;//c*3是临时变量,具有常性,触发权限变大。
}

五.指针与引用的异

(1.语法概念上,引用不用开空间,而指针需要开空间存储变量的地址。

(2.引用在定义时必须初始化,指针建议。

(3.引用在初始化时引用一个对象后不能再引用别的对象,而指针可以不停的改变对象。

(4.引用可以直接访问指向对象,指针需要解引用才能访问对象。

(5.sizeof中含义不同,引用的结果就是该变量的类型大小,比如int a=4;int &ra=a;sizeof(ra)=4。但指针是个地址随着机器地址的不同而改变(32位平台下占4个字节,64位平台下占8个字节)。

(6.指针很容易出现空指针和野指针的问题,引用很少出现。

六.inline(内联函数)

在学习C语言的时候,学到了宏函数,它在预处理时会替换展开。Add的宏函数是#define Add(x,y) ((x)+(y))。括号是不是很麻烦,而且不方便。所以C++设计了内联函数替代C的宏函数。

(1.编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。

(2.inline适用于频繁调用的短小函数,对于递归函数,代码相对较多的函数。加上inline也会被编译器忽略,即函数不会展开。

(3.vs编译器debug版本下面默认是不展开inline的,这样方便调试。

(4.inline不建议声明和定义分离到两个文件,分离就会导致inline被展开,就没有函数的地址(因为inline函数不会形成栈帧地址),链接时会出现报错(头文件的声明会将函数汇总到符号表中,因为只有声明,没有有效地址,不能找到函数的定义)。

// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
// 链接错误:⽆法解析的外部符号 "void __cdecl f(int)" (?f@@YAXH@Z)
f(10);
return 0;

七.nullptr关键字

C语言中我们知道NULL,被定义为无类型指针(void*)的常量,但在C++中NULL可能被定义为字面常量0。而nullptr关键字是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型。使用nullptr定义的空指针可以避免类型转换的问题,因为nullptr只能隐式转换为指针类型,而不能被转换为整型。

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
// 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
// f((void*)NULL);
f(nullptr);
return 0;
}

结果如下。

cpp入门基础知识 c++入门 阅读详情

相关推荐

matianl:SAP 最详细的权限管理解析

上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。

matinal 當冬夜漸暖 。公众号:matinal 2155

【C++】Cpp入门基础知识

Cpp入门基础知识  一,命名空间     首先应该明白数据在内存中的存储位置,如下图所示;  理解域为一个代码框,一个变量的作用域为一个代码框,在主函数外定义的无框变量的作用域是全局即整个程序。 在任何一个域中都可以使用全局变量,所以应尽量减少使用全局变量,会让程序不稳定。 在不同的域可以重名定义变量,如下面的变量a,输出时使用该域中的变量。 namespace定义一个域,u

LazyFish的博客 1035

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

【C++】入门基础知识(上)

本篇主要围绕 C++ 中的基础知识进行讲解,主要包括命名空间、输入输出、缺省函数、函数重载等内容,希望能够给你到来帮助。

2401_87820834的博客 1391

别再踩坑了!CAPL脚本里局部变量和全局变量的那些“怪事”(附CANoe实测代码)

本文深度解析CAPL脚本中局部变量和全局变量的特殊机制,揭示其与通用编程语言的差异。通过实测代码展示静态局部变量的默认行为和全局变量的节点隔离特性,并提供高效避坑指南,帮助汽车网络测试工程师避免常见陷阱。

weixin_30225755的博客 293

创客学院嵌入式驱动开发——学习资料汇总

1.创客学院知识巩固-01C语言回顾_C/C++_Set_Mode的博客-优快云博客https://blog.youkuaiyun.com/Set_Mode/article/details/94431050 2.创客学院知识巩固-02数据结构_Set_Mode的博客-优快云博客https://blog.youkuaiyun.com/Set_Mode/article/details/94431087 3.创客学院知...

snaking616 5116

【C++】入门基础知识

本文介绍了C++的入门基础知识,包括程序结构、数据类型、控制结构和基本输入输出。对于初学者来说,掌握这些基本概念是学习C++的第一步。接下来,可以继续深入学习C++的面向对象特性、标准模板库(STL)等内容。通过不断的练习和项目实践,你将能够熟练运用C++进行各种软件开发。

小蜗牛的珍贵百宝箱 410

【异常】Claude Code CLI工具 模型加载异常 /init报错排查与完整解决方案 There‘s an issue with the selected model (glm-5). It

此类跨厂商模型配置报错,核心诱因是API生态的兼容性不匹配。优先使用工具原生支持的模型体系,可快速解决90%以上的同类报错;若需跨厂商使用目标模型,需完成API端点、鉴权密钥、模型ID的全链路适配,确保全流程配置合规,即可完成异常修复。

奶爸的编程之路,也就一周冷个三天 3704

C++基础知识1 入门基础

1.C++历史 2. C++版本更新 3. C++参考⽂档: 4. C++的应用 5.C++的第一个程序 6. 命名空间 6.1 namespace的价值 6.2 namespace的定义 6.3 命名空间使⽤ 7. C++输⼊&输出 8. 缺省参数 9. 函数重载 10. 引⽤ 10.1 引⽤的概念和定义 10.2 引⽤的特性 10.3 引用的使用 10.5 指针和引⽤的关系 11. inline 12. nullptr

Yusei_0523的博客 1263

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1932

YOLOv11改进前必看 - YAML模型配置文件详细解读(再也不用担心通道数不匹配) 附网络结构图

YOLOv11的模型配置文件在中,里面包含以及,本文以目标检测模型文件为例(其他文件完全一致),详细介绍一下YOLOv11模型文件中各参数的含义。

Limiiiing的博客 5310

C++入门基础知识总结(2022整理)

一、C++入门基础知识之什么是C++? 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。 PDF版、C++资料教程、C++电子书籍获取 关注微信公众号:“ C和C加加 ” 回复关键字:“ C++ ”即可领取 二、C++入门基础..

weixin_55305220的博客 2万+

物联网设备数据是如何流转的:基于EMQX与TDengine的前后端分离项目实践

背景 在我写了TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转这篇文章后,不少读者朋友评论、私信说可不可以提供代码参考学习下,那必须是可以的。那篇文章主要介绍了数据采集、数据传输、数据转发、数据解析、数据存储、数据查询、数据呈现、数据导出、消息推送的物联网设备数据流程过程,作为体验 TDengine 的极简实战项目,没引入过多的业务设计(复杂功能)以及异步解耦设计(消息中间件)。 在整理代码的过程中,我发现虽然整个项目并不复杂,但是涉及到的技术点较多,有必要对关键的组件进行说明

Heartsuit的博客 9412

C++入门基础知识(一)

1979年,C++初生萌芽。在1983年的时候,正式改名为C++,本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)所创。C++既可以进行C语言的面向过程化的程序设计,也可以像Java语言面向对象(封装、继承、多态)的程序设计。它是一种中级语言,介于高级语言(自然语言)与低级语言(机器语言)之间。

文优 2735

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

c++入门的基础知识

有关c++的基础知识【命名空间】【输出&输入】【缺省函数】【函数重载】【引用】【内联函数】【auto关键字】【范围for循环】【指针空值nullptr】

aaa114514aaaa的博客 5683

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++入门基础知识1

C++新入门基础知识

go_bai的博客 807

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++入门基础知识介绍(一)

namespace关键词的引入、C++的输入与输出、缺省参数和函数重载。

zhang_yu_hao的博客 5988

【C++】基础知识入门篇2

当函数返回,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用 引用返回,如果已经还给系统了,则必须使用传值返回。图 1 传值返回的过程图 2 传引用返回。

MOV_AH_4CH的博客 1022

从0到1入门C++编程——01 C++基础知识

本文是从0到1入门C++编程的第一小节,C++基础知识的介绍,本文中很多知识都是在C语言中学习过的,用的编程工具是Visual Studio。

西岸贤 1707

【C++】C++入门基础知识

在早期的C/C++中auto的含义是:使用auto修饰的变量是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它。在C++11中,标准委员会赋予了auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。return 10;auto b = a;//auto e;无法通过编译,使用auto定义变量时必须对其进行初始化return 0;【注意】

weixin_42976474的博客 751

【C++】入门基础知识(下)

本文主要延续 C++ 基础知识(上)对 C++ 基础知识作进一步的讲解,内容主要包括:引用、引用与指针、inline 内联函数、nullptr等知识。

2401_87820834的博客 1428

【C++】<入门>C++入门基础知识

C++从入门到入土

禁止未经本人书面授权情况下转载,否则后果自负 2265
上一篇: 【数据结构】顺序表的运用之通讯录的实现
下一篇: c++类和对象(上)
噜啦噜啦嘞好
博客等级 码龄3年 212粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值