C++STL
前言
本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用
参考视频黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难
模板的概念
模板就是建立通用的模具,大大提高复用性
例如生活中的模板
一寸照片模板:
PPT模板:
模板的特点:
模板不可以直接使用,它只是一个框架
模板的通用并不是万能的
函数模板
C++另一种编程思想称为 泛型编程 ,主要利用的技术就是模板
C++提供两种模板机制:函数模板和类模板
函数模板语法
函数模板作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
语法:
12template<typename T>函数声明或定义
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母
示例:
1234567891011121314151617181920212223242526272829303132333435363738 ...
C++核心编程
前言
简单介绍C++面向对象。参考教程黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难
内存分区模型
C++程序在执行时,将内存大方向划分为4个区域
代码区:存放函数体的二进制代码,由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区意义:
不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程
程序运行前
在程序编译后,生成了可执行程序,未执行该程序前分为两个区域
代码区:
存放 CPU 执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此.
全局区还包含了常量区, 字符串常量和其他常量也存放在此.
该区域的数据在程序结束后由操作系统释放
示例:
12345678910111213141516171819202122232 ...
LeetCode算法思路记录
🚀 更新判断环形链表
前言
初次刷题的感想:思路很简单,实现起来却很困难。为了丰富编码经验本篇文章来记录刷题的大体思路,我会提供一些C语言代码提供参考。希望对你们也有帮助。
在实践中去体验算法的思想,才能对算法有深刻的理解。话不多说让我们开启这趟体验算法乐趣的列车吧。
69. x 的平方根
题目描述
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
暴力解法
代码实现
12345678910int mySqrt(int x) { long int i; for (i = 1; i <=x; i++) { if (i * i > x) return i - 1; else if (i * i == x) return i; } return 0;}
算法分析
int mySqrt(int x) {:定义一个名为mySqrt的函数 ...
网络编程实验
前言
一些网络编程的实验,和网络编程的概念,参考书APUE,这里主要通过实验来理解概念。只有实践才是验证真理的唯一标准。
第一天
网络模型
目标
一些网络编程概念,无需马上全部了解,结合后序实验理解起来更佳。
实现简单的C/S的模型。
OSI七层模型
物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1
网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要 ...
30天自制操作系统
前言
手写操作系统,听起来就是一件不可能完成的工作。但如果不去了解操作系统也就无法写出高效率的程序。手写操作系统注定是一个非常艰辛的过程或者说回报是不确定的。就个人而言我比较喜欢去了解事物发生的源头,所以不去了解底层原理我的大脑中就会一直有疑问。
虽说现在学习资源很好获得,但你能用的又有多少,其实到最后你可能发现谁都无法帮你解决问题,到最后都是你自己解决问题。网上的学习资料鱼龙混杂你根本找不到你真正所需要的,搞不好会落入营销号的圈套。到最后都会回归到书本,你最讨厌学的,最枯燥的往往是重要的。
现在我基于《30天自制操作系统》这本书去实践写一个简单的操作系统。
这是一个挑战,我无法确定我是否可以完成这个艰巨的任务。
准备工作
在这本书中的内容无法完全采用。
所使用的工具gcc,make,nasm,bochs
平台:ubuntu
nask和nasm的区别
这里不使用书中的nask编译器,直接使用nasm编译器。nask和nasm区别不大。其中主要的差别如下:
12345678910nask代码 NASM代码JMP entry -&g ...
10大排序
前言
在我刚学数据结构的时候,我觉得这些算法很死板,大不了直接背会了不就完了。但后来我发现我根本记不住,过一阵子就会忘记,更别提算法的思想了。所以我总结这十大基本算法。其中代码只是载体,最重要的是其中的思想。这些思想无一不展现了早期计算机科学家的智慧。当然对于我来说即使是公认为最简单的冒泡排序也是很难的。但我还是觉得这些东西还是很值得琢磨的。
10大排序简称"堆雪插炮击,统计快归西",分别为堆排序、选择排序、插入排序、冒泡排序、基数排序、桶排序、计数排序、归并排序、希尔排序。
冒泡排序
主要思想
冒泡排序字如其名不做过多解释,假设我们使用数组来作为载体,其中数组长度为MAX。
大体思路(排序从小到大): 首先对数组遍历,使其每一次遍历都会使最大的元素到数组的末尾,实现方法就是将像第一次样的遍历,只不过其中上一次最大的已经是数组中最大的,这一次就不用将其考虑在内,比较相邻两个元素,将较大的往后移。
实现方式
这里我使用到了随机数,为了避免运行时的偶然性,其中数组大小可以更改MAX宏。使用时间来作为随机数种子,其代码主要实现方式如上。
代码实现
12345678 ...
git的使用
仓库篇
创建仓库
12git initgit init newrepo
配置
1234567891011121314git config --list #查看当前git的配置信息git config -e #针对当前仓库git config -e --global #针对系统上所有仓库#告诉Git你是谁git config --global user.name "name"git config --global user.email youemail#选择你喜欢的文本编辑器git config --global core.editor vim#添加一些快捷方式(别名)git config --global alias.st statusgit config --global alias.co checkoutgit config --global alias.br branchgit config --global alias.up rebasegit config --global alias.cm commit
git免除账号密码
git config - ...
gcc的使用
gcc的使用
gcc编译4步骤
gcc编译常用参数
-I 指定头文件所在目录位置
-c 只做预处理,编译,汇编。得到二进制文件
-g 编译时添加调试文件,用于gdb调试
-Wall 显示所有警告信息
-D 向程序中“动态”注册宏定义
-l 指定动态库库名
-L 指定动态库路径
-o 指定生成文件名称
vim的使用
vim的使用
vim的三种工作模式
vim基本操作
命令行模式
i 进入编辑模式,光标前插入字符
a 进入编辑模式,光标后插入字符
o 进入编辑模式,光标所在行的下一行插入
I 进入编辑模式,光标所在行的行首插入
A 进入编辑模式,光标所在行的行末插入字符
O 进入编辑模式,光标所在行的上一行插入字符
s 删除光标所在字符并进入编辑模式
S 删除光标所在行并进入编辑模式
x 删除光标所在字符,工作模式不变
dw 删除光标所在单词,要求光标在首字母上,如果不在首字母,只会删除当前位置到单词末,工作模式不变
D 删除光标所在位置到行末,工作模式不变
0(数字) 光标移到行首,工作模式不变
$ 光标移到行尾,工作模式不变
d0 删除光标所在位置到行首,工作模式不变
d$ 删除光标所在位置到行末,工作模式不变
h 左移
j 下移
k 上移
l 右移
gg 跳转到首行
G 跳转到末行
大括号跳转
命令模式下,光标处于左大括号时,使用%跳转到对应右大括号,再按%跳回去。
其他括号也可以这样
删除
替换单个 ...
makefile的使用
一、makefile是什么?
Makefile是一个描述文件,用于自动化构建程序的过程。它指定了如何从源代码文件生成可执行文件或库文件等目标文件。Makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,以及在什么情况下需要重新编译。
二、使用步骤
makefile或Makefile 才可以 使用make 命令
1 个规则:
目标:依赖条件
(一个tab缩进)命令
1. 目标的时间必须晚于依赖条件的时间,否则,更新目标
2. 依赖条件如果不存在,找寻新的规则去产生依赖条件。
ALL:指定 makefile 的终极目标。(否则把第一个规则的目标当做总目标)
2个函数:
作用: $(name) 取name的值 在脚本中变量的值就是字符串
src = $(wildcard ./*.c): 匹配当前工作目录下的所有.c 文件。将文件名组成列表,赋值给变量 src。 src = add.c sub.c div1.c
obj = $(patsubst %.c, %.o, $(src)): 将参数3中,包含参数1的部分,替换为参数2。 obj = ...