【C++体系】C/C++要点复习

Dev C++ Socket编程与ws2_32库链接:从实践到C/C++面试系统复习 网络编程是C/C++开发者必须掌握的核心技能之一,其基础在于理解Socket通信原理。Socket作为网络进程间通信的端点,通过TCP/IP协议栈实现可靠的数据传输。在Windows平台进行Socket编程时,需要链接ws2_32库,这涉及到动态链接库的加载机制和编译链接过程。掌握这些底层原理不仅能解决实际开发中的编译错误,更能深化对系统API、跨平台编程和项目构建的理解。本文以Dev C++环境下的Windows Socket编程为例,通过配置链接参数、实现TCP回显服务器等实操环节,系统串联了网络协议、 阅读详情

前言

为了准备秋招及春招,现阶段的任务是将所学过的知识进行复习,并串联起来。
首当其冲的就是编程语言的复习,C++自己平时写的也比较多,但仍有很多语法细节不太记得了,这里浅记一些平常容易忽略的要点。

C++基础入门

一维数组数组名

一维数组名称的用途:

  1. 可以统计整个数组在内存中的长度(单位:字节B)
  2. 可以获取数组在内存中的首地址

已知一个数组的数组名,求数组元素的个数,如下:

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;
cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;
cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;

可以通过数组名获取到数组首地址:

cout << "数组首地址为: " << (int)arr << endl;
cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl;
cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;

这里首地址即为第一个元素的地址

指针

指针所占内存空间

所有指针类型在32位操作系统下是4个字节

cout << sizeof(int *) << endl; // 4
cout << sizeof(char *) << endl; // 4
cout << sizeof(float *) << endl; // 4
cout << sizeof(double *) << endl; // 4

空指针和野指针

空指针:指针变量指向内存中编号为0的空间

int * p = NULL;

用途:初始化指针变量
注意:空指针指向的内存是不可以访问的


野指针:指针变量指向非法的内存空间

int * p = (int *)0x1100;

//访问野指针报错 
cout << *p << endl;

两者共同点:都不能访问

const修饰指针

const修饰指针有三种情况:

  1. const修饰指针 — 常量指针 (const int * p)
    const修饰的是指针,指针指向可以改,指针指向的值不可以更改

  2. const修饰常量 — 指针常量 (int * const p)
    const修饰的是常量,指针指向不可以改,指针指向的值可以更改

  3. const即修饰指针,又修饰常量 (const int * const p)
    const既修饰指针又修饰常量,两者均不可修改

指针和数组

利用指针访问数组中的元素

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

int* p = arr;  //指向数组的指针

cout << "第一个元素: " << arr[0] << endl; // 1
cout << "指针访问第一个元素: " << *p << endl; // 1
cout << "指针访问第二个元素: " << *(p+1) << endl; // 2

for (int i = 0; i < 10; i++)
{
	//利用指针遍历数组
	cout << *p << endl;
	p++;
}

指针和函数

利用指针作函数参数,可以修改实参的值

// 地址传递
void swap2(int * p1, int *p2) // 声明与定义
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
swap(&a, &b);  // 调用传参

如果是数组名作为函数参数的话,两种写法效果相同,因为数组名就代表了首元素的地址

void bubbleSort(int * arr, int len)  //int * arr 也可以写为int arr[]
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

结构体

结构体指针

通过指针访问结构体中的成员
利用操作符 -> 可以通过结构体指针访问结构体属性

student stu = { "张三",18,100};
student * p = &stu;
p->score = 80; //指针通过 -> 操作符可以访问成员
cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;

函数参数

结构体作函数参数时,如果不想修改主函数中的数据,用值传递,反之用地址传递

// 声明
void printStudent2(student *stu);
// 调用
printStudent2(&stu);

C++核心编程

内存4大分区

C++程序在执行时,将内存大方向划分为4个区域:

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的。特点共享、只读。
  • 全局区:存放全局变量、静态变量、常量,该区域的数据在程序结束后由操作系统释放
  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
  • 堆区:由程序员分配和释放内存(new),若程序员不释放(delete),程序结束时由操作系统回收

new操作符

C++中利用new操作符在堆区开辟数据
利用new创建的数据,会返回该数据对应的类型的指针

int* a = new int(10); // 创建一个值为10变量

开辟数组

int* arr = new int[10];
delete[] arr;

引用&(指针常量)

作用:给变量起别名,本质上还是原来那个变量

  • 引用必须初始化
  • 引用在初始化后,不可以改变(易错)

int a = 10;
int b = 20;
//int &c; //错误,引用必须初始化
int& c = a; //一旦初始化后,就不可以更改
c = b; //这是赋值操作,不是更改引用,a的值也会改变

cout << "a = " << a << endl; // 20
cout << "b = " << b << endl; // 20
cout << "c = " << c << endl; // 20

由于c是a的别名,c在被重新赋值后,a也会随之改变
这个特点也印证了,引用本质上是一个指针常量,即指针指向的值可以修改,但是指针的指向不允许修改。

引用作函数参数

可以代替指针,实现函数内修改实参的操作

通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单

void mySwap03(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}
mySwap03(a, b);

函数重载

函数名可以相同,提高复用性

函数重载满足条件:

  1. 同一个作用域下
  2. 函数名称相同
  3. 函数参数类型、个数、顺序至少要有一个不同

注:函数返回值不可以作为函数重载条件

类与对象

构造/析构函数写法

类的定义

class Person {
public:
	Person() {
		cout << "无参构造函数!" << endl;
		mAge = 0;
	}
	Person(int age) {
		cout << "有参构造函数!" << endl;
		mAge = age;
	}
	Person(const Person& p) {
		cout << "拷贝构造函数!" << endl;
		mAge = p.mAge;
	}
	//析构函数在释放内存之前调用
	~Person() {
		cout << "析构函数!" << endl;
	}
public:
	int mAge;
};

利用类创建对象

Person man1; // 无参构造
Person man2(100); // 有参构建
Person newman(man); // 拷贝构造函数

深拷贝与浅拷贝

浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作

如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的重复释放内存空间的问题

class Person {
public:
	Person() {
		cout << "无参构造函数!" << endl;
	}
	
	Person(int age, int height) {
		cout << "有参构造函数!" << endl;
		m_age = age;
		m_height = new int(height);  // 堆区开辟
	}
	
	//拷贝构造函数  
	Person(const Person& p) {
		cout << "拷贝构造函数!" << endl;
		//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
		m_age = p.m_age;  // 非堆区开辟
		m_height = new int(*p.m_height);  // 堆区开辟

	}

	//析构函数
	~Person() {
		cout << "析构函数!" << endl;
		if (m_height != NULL)
		{
			delete m_height;
		}
	}
public:
	int m_age;
	int* m_height; // 堆区开辟
};

列表初始化

一种简化语法的操作

class Person {
public:

	////传统方式初始化
	//Person(int a, int b, int c) {
	//	m_A = a;
	//	m_B = b;
	//	m_C = c;
	//}

	//初始化列表方式初始化
	Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {}
private:
	int m_A;
	int m_B;
	int m_C;
};

静态成员变量

即可以通过对象名访问,也可以通过类名访问(类名::静态成员变量名)
静态成员变量特点:

  1. 在编译阶段分配内存
  2. 类内声明,类外初始化
  3. 所有对象共享同一份数据

定义与初始化:

class Person
{
public:
	static int m_A; //静态成员变量
private:
	static int m_B; // 如果设为私有,类外也无法直接访问
};
int Person::m_A = 10; // 初始化
int Person::m_B = 10;

Person p1;
p1.m_A; // 创建对象,利用对象名调用
Person::m_A; // 直接通过类名调用

this指针(重要)

this指针在Java中也存在,不过用法上还是略有区别

this指针指向被调用的成员函数所属的对象

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this
class Person
{
public:
	Person(int age)
	{
		//1、当形参和成员变量同名时,可用this指针来区分
		this->age = age;
	}

	Person& PersonAddPerson(Person p)
	{
		this->age += p.age;
		//返回对象本身
		return *this;
	}

	int age;
};

// 因返回的是对象本身,所以可以连续调用
p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);

友元

友元分为三种:

  • 全局函数作友元
  • 类作友元
  • 成员函数作友元

第一种最简单,直接声明前加上friend关键字,放在类的最前头即可

friend void goodGay(Building * building);

第二种需要考虑到类定义的顺序
被友元访问的那个类,需要事先声明,顺序如下:

class B;

class A
{
public:
...
private:
	B *b;
};

class B
{
	friend class A;
};

第三种成员函数作友元,与类友元类似,不过只有类中特定的一个成员函数可以访问。总体形式一样,区别在于声明语句

friend void goodGay::visit();

运算符重载

不能重载的运算符有5种,分别是.、->、sizeof、?:、::

加号
class Person {
public:
	Person() {};
	Person(int a, int b)
	{
		this->m_A = a;
		this->m_B = b;
	}
	//成员函数实现 + 号运算符重载
	Person operator+(const Person& p) {
		Person temp;
		temp.m_A = this->m_A + p.m_A;
		temp.m_B = this->m_B + p.m_B;
		return temp;
	}

public:
	int m_A;
	int m_B;
};

//全局函数运算符重载 可以发生函数重载 
Person operator+(const Person& p2, int val)  
{
	Person temp;
	temp.m_A = p2.m_A + val;
	temp.m_B = p2.m_B + val;
	return temp;
}

使用方法

Person p1(10, 10);
Person p2(20, 20);
Person p3 = p2 + p1;
Person p4 = p3 + 10;
左移

只能在全局函数中实现

//全局函数实现左移重载
//ostream对象只能有一个
ostream& operator<<(ostream& out, Person& p) {
	out << "a:" << p.m_A << " b:" << p.m_B;
	return out;
}

并且要作为友元,放在原类中

friend ostream& operator<<(ostream& out, Person& p);

继承

基本语法

class A : public B;

A 类称为子类 或 派生类
B 类称为父类 或 基类

class Base1
{
public: 
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};

//公共继承
class Son1 :public Base1
{
public:
	void func()
	{
		m_A; //可访问 public权限
		m_B; //可访问 protected权限
		//m_C; //不可访问
	}
};

成员函数变量同名

  1. 子类对象可以直接访问到子类中同名成员
  2. 子类对象加作用域可以访问到父类同名成员
  3. 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
s.m_A; // 子类的变量
s.Base::m_A; // 父类的变量,加类名访问
s.func(); // 子类的函数
s.Base::func(); // 父类的函数,加类名访问

多态

父类指针或引用指向子类对象

  • 静态多态: 函数重载和运算符重载属于静态多态,复用函数名——编译阶段确定函数地址
  • 动态多态: 派生类和虚函数实现运行时多态——运行阶段确定函数地址

父类定义一个虚函数,子类通过重写虚函数实现多态

// 父类
virtual void speak() {
		...
}

计算器

创建一个计算器父类与加法子类,并重写虚函数

//多态实现
//抽象计算器类
//多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展以及维护
class AbstractCalculator
{
public :

	virtual int getResult()
	{
		return 0;
	}

	int m_Num1;
	int m_Num2;
};

//加法计算器
class AddCalculator :public AbstractCalculator
{
public:
	int getResult()
	{
		return m_Num1 + m_Num2;
	}
};

使用方法:

//创建加法计算器
AbstractCalculator *abc = new AddCalculator;
abc->m_Num1 = 10;
abc->m_Num2 = 10;
cout << abc->m_Num1 << " + " << abc->m_Num2 << " = " << abc->getResult() << endl;
delete abc;  //用完了记得销毁

纯虚函数与抽象类

这个点也是比较陌生的点,平常很少用到不涉及,且和Java有一定程度上的区别

考虑到父类一般是抽象类,所编写的纯虚函数可能并不存在对应的实现,因此就要把它定义为纯虚函数

纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点:

  • 无法实例化对象
  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
  • 类中只要有一个纯虚函数就称为抽象类
class Base
{
public:
	virtual void func() = 0;
};

class Son :public Base
{
public:
	void func()
	{
		cout << "func调用" << endl;
	};
};

虚析构与纯虚析构

存在的问题:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

解决方式:将父类中的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构共性:

  • 可以解决父类指针释放子类对象(作用),提醒子类必须重写自己的析构函数
  • 都需要有具体的函数实现

虚析构和纯虚析构区别:

  • 如果是纯虚析构,该类属于抽象类,无法实例化对象
class Animal {
public:

	Animal()
	{
		cout << "Animal 构造函数调用!" << endl;
	}
	virtual void Speak() = 0;

	virtual ~Animal() = 0;
};

Animal::~Animal()
{
	cout << "Animal 纯虚析构函数调用!" << endl;
}

class Cat : public Animal {
public:
	Cat(string name)
	{
		cout << "Cat构造函数调用!" << endl;
		m_Name = new string(name);
	}
	void Speak()
	{
		cout << *m_Name << "小猫在说话!" << endl;
	}
	~Cat()
	{
		cout << "Cat析构函数调用!" << endl;
		if (this->m_Name != NULL) {
			delete m_Name;
			m_Name = NULL;
		}
	}
public:
	string* m_Name;
};

未完待续……

参考资料

  1. 黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难
  2. 《C++ Primer》
C++知识体系图解(超详细) 本文档用于解析C++知识图解,打开时请用XMind软件打开!!! 立即下载

相关推荐

c++知识体系框架图

c++知识体系框架图

C++期末复习超详细总结知识点(期末冲刺)

4.3、字符数组。

2401_86436674的博客 1894

virtuoso--DFF

27-实验课-std_cell2

qq_61440044的博客 2004

C/C++知识复习(一)

一 C与C++的区别 1.C是面向过程的语言,而C++是面向对象的语言,因此C++语言中有类和对象以及继承、多态这样的OOP语言必备的内容,此外C++支持模板,运算符重载,异常处理机制,以及一个非常强大的C++标准模板库STL 2.C只能写面向过程的代码,而C++既可以写面向过程的代码,也可以实现面向对象的代码;既然C++是面向对象的OOP语言,因此它还有非常强大的设计模式,比如单例,工厂,观察者...

weixin_43611545的博客 869

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1531

5G边缘计算:核心网下沉革命

5G核心网与边缘计算的深度融合,通过UPF下沉、本地流量卸载等关键技术,实现了低时延、高效能的分布式计算架构。该技术将数据处理从核心网向边缘节点转移,支持工业控制、车联网、远程医疗等场景的1-10ms超低时延需求。5G核心网的SBA架构和CUPS设计为边缘计算提供了灵活部署基础,SMF、PCF等网元协同确保业务质量与可靠性。

Qinti_mm的博客 1402

C/C++经典复习知识点 精华满满

复习C和C++的基础内容C语言指针部分C语言函数指针和回调函数六种操作字符串的函数输入&输出C++goto语句if循环第二种表示C++的函数组成数学函数序号函数 & 描述随机数C++数组字符串函数(同C语言)C++引用引用作为返回值,必须遵守以下规则:日期&时间输入&输出 以下内容为复习过程中整理的零碎内容! 结构体内容未分享 C语言 指针部分 C语言函数指针和回调...

qq_42000088的博客 914

YOLOv8首发优化:遥感目标检测 | 专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块,解决低空间分辨率、传感器噪声、目标模糊、低光照退化和部分遮挡等限制

一种轻量级网络,其创新性地整合了专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 492

C/C++面试知识点总结(一)

目录: 一、基础知识 1.C/C++基础 2.STL基础3.数据结构与算法基础 4.计算机网络基础5.操作系统基础6.数据库基础二、深入底层原理1.STL各种容器的底层实现2.各种经典树的原理以及实现 3.计算机网络深入4.操作系统深入5.数据库深入三、项目经历 1.纯属个人YY 一、基础知识 1.C/

_ACME_的博客 4万+

【图论】系列(一)之图论的构成

图论是研究图的数学分支,本章介绍了图论的基本构成和概念

qq_30066733的博客 748

大学C++程序设计教程期末复习重点

第一章1.cin与count的应用&lt;iostream&gt;例:cin&gt;&gt;a;cout&lt;&lt;"hello"&lt;&lt;endl;cout&lt;&lt;he&lt;&lt;15&lt;&lt;endl;cout.wtdth(10);//cout.fill("*");调整字段宽度的函数int width():a、控制符int w

Aron's Blog 1万+

GJB设计开发各阶段的文件和记录要求

GJB设计开发各阶段的文件和记录要求

Abel的博客 4054

数据结构笔记整理:从408代码必背到期末复习的完整指南

数据结构是计算机科学的核心基础,它研究数据在内存中的组织方式与操作效率。从数组、链表到树、图,每一种结构都蕴含着时间与空间的权衡。理解其原理,不仅能应对考研408统考的代码必背题,还能为实际工程中的性能优化提供理论支撑。本文基于长期整理的“数据结构笔记”,系统梳理了核心算法模板、常见易错点以及不同教材的对比分析,帮助学习者在期末复习、考研冲刺或日常自学中快速建立知识体系。笔记持续更新,覆盖从C语言到Python多语言实现,无论是链表反转、哈希冲突还是二叉树遍历,均给出从原理到代码的完整推导路径。

weixin_32183107的博客 233

Windows 镜像包大全(附百度云下载链接)

插入U盘,找到下载好的两个驱动软件,并安装,先打开驱动人生万能网卡版,安装好网卡驱动,可以接入wifi或者网线了,然后打开驱动精灵,按照提示,安装所有的驱动(中间要是让你重启,就先选择稍后再说,如果有的驱动安装好之后非要你重启,关不掉的那种,那你就重启吧),等全部安装好了,重启电脑。如果你有显卡,这里以英伟达举例,我是GTX960的,当你的驱动都安装好后,右键桌面,会出现一个英伟达控制面板。安装软碟通,下载之后,一直下一步就ok,啥也不用配置,到了最后一项点击“继续试用”即可。(下载里面的网卡版即可),

悦分享 7355

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【软考-软件设计师备考指南】核心考点解析与高效复习策略

本文为软考软件设计师考试提供全面的备考指南,深入解析核心考点与高效复习策略。文章详细解读考试大纲,将知识体系分为计算机基础综合与软件工程设计实务两大部分,并针对上午选择题和下午设计题分别提供解题技巧与复习重点。通过分阶段的复习规划与资源推荐,帮助考生系统构建知识框架,掌握题型套路,从而高效备考,顺利通过考试。

weixin_29247219的博客 164

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C/C++总结、复习,重点知识整理

STL:数据结构:

2401_83238095的博客 392

深度学习工具包 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")

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

安全传输平台项目扩展——C复习-C++复习-keymngclient重构

在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。 10-安全传输平台项目扩展-第01天(C复习-C++复习-keymngclient重构) 一、课程目标 用C++重构安全传输平台 深入理解C语言知识体系 两个模型(函数调用、内存四区模型)指针做函数参数(一级指针、二级指针、三级指针;指针的输入和输出) 函数指针...

Alliswell_WP 496

大学生想依靠c/c++找工作,还需要什么知识?

简单自我介绍,我于2017年本科毕业,专业是计算机科学与技术,现在在百度从事 linux c++ 大数据服务开发的工作。在校园招聘中一共面试12家公司,拿到了12个offer。其中大部分是c++开发的岗位,除此之外还有java开发。算法,大数据,运维等岗位。 从题主的描述,并没有说自己现在是大几或者是研几,因为我认为每个阶段应该去接触什么样的知识,以及如何去培养自己的能力侧重点是不同...

weixin_45820912的博客 4600

【C/C++ 学习路线】【转载】

前言于我而言,最开始学习就是,除了计算机专业,其他专业可能学习的第一门编程语言为语言,还是谭浩强爷爷那本,当时想着有点基础,无外乎就是语言的升级版,于是开启了的路程。语言这个东西,可能过后你会发现,它真就一工具,你如果想做个爬虫或者数据分析,那多半会选择,无论是接口还是开源社区都非常的完善,如果想做一个快速迭代的项目,也可以选择的框架或者 Java的框架快速完成开发,如果是内核驱动,那老老实实的用大哥 C,如果玩儿数据库,搜索引擎就整 C++,如果是分布式或者那一套,自然就是。

j8267643的博客 1076

C/C++复习

C/C++复习 C/C++基础语法 static关键字作用 修饰变量 存储位置 - 静态存储区 链接属性,本文件内有效 修饰函数 链接属性 - 本文件内有效 修饰成员变量和成员函数 静态成员函数没有this指针, 类和对象都可以调用 静态成员函数不能是虚函数 静态成员变量必须在类外初始化 static和全局的区别 const的作用 修饰变量不能被修改,指针可以修改但是注意编译...

Cyrus_wen的博客 413

interview 开源仓库 C/C++ 技术面试知识体系全解:从语言核心到链接装载库的复习路线图

本文以 interview 仓库的英文版主文档 [README_en.md](https://link.gitcode.com/i/2f96c0f274e0280ce4acdc4046ea522b) 为骨架,系统梳理面向 C/C++ 校招求职者与初学者的整套面试知识体系:语言核心、Effective 实践、STL、数据结构、算法、操作系统、计算机网络、数据库、设计模式与链接装载库。读者通读本文后,

gitblog_06834的博客 138

【期末复习】转眼到了C++的复习时间(更新中)

时间过的很快。似乎昨天才刚刚开学,转眼间已经到了期末复习的时间了。距离C++期末考试还有一个月的时间,我正式开始了C++的复习计划,以期让我在后期可以更加从容、淡定,能够拥有更多的时间去投入到自己想去做的事情上去。

咸鱼的小小世界 1725

【C++篇】深入解析C/C++内存管理:从原理到实践

哈喽!我是我想吃余!我们来进入今天的学习吧!😎在C/C++开发中,内存管理是开发者必须掌握的核心技能之一。无论是手动分配释放内存的灵活性,还是由此带来的内存泄漏风险,这一领域始终充满挑战。如果你对动态内存管理有一定的了解,那么你是否曾困惑于malloc与new的区别?是否因内存泄漏导致程序崩溃却无从排查?又是否在面试中被问及“堆与栈的区别”却难以系统回答?本文以C/C++内存管理为核心,从内存分布、动态内存操作、new/delete的实现原理,到定位new。

Surplus886的博客 885

视频教程-C++精讲系列视频--CPP语言(0618.)-C/C++

C++精讲系列视频--CPP语言(0618.) 毕业于清华大学,曾担任Goo...

weixin_29033035的博客 147

从理论到实践:如何通过CPP-Crash-Course快速掌握C++编程技巧

**CPP-Crash-Course**是一个专为C程序员设计的C++快速入门教程项目,提供从基础语法到高级特性的完整学习路径。这个开源项目通过实用的代码示例和清晰的解释,帮助开发者快速从C语言过渡到现代C++编程,掌握面向对象编程、模板、异常处理等核心概念。无论你是刚接触C++的新手,还是希望系统复习C++知识的开发者,这个项目都能为你提供有价值的参考。 ## 📚 项目概述与核心价值 CP

gitblog_00617的博客 494
上一篇: 【buaa机试题】机场登机口调整
下一篇: 【C++体系】如何启动操作系统?不要只回答按电源键啦
CodeSlogan
博客等级 码龄6年 4227粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeSlogan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值