- 博客(36)
- 收藏
- 关注
原创 TortoiseSVN的使用
SVN保持数据的地方,所有的文件都保存在这个库中,Tortoise访问的就是远程服务器上的Subversion版本库。就是工作副本,可将版本库的文件拷贝到本地中,可以任意修改, 不会影响版本库。在你明确地做了特定操作(如commit/conflict)之前,Suvbversion不会把你的修改和其他人的合并,也不会把你的修改展示给别人,你甚至可以拥有同一个项目的多个工作拷贝。通常你的工作拷贝下都有一个以.svn命名的文件夹。当工作拷贝进行提交,版本库接受提交,版本库的内容就会变成工作拷贝的内容。 每当版本库
2023-02-15 15:16:43
6063
原创 stack和queue的模拟实现
stack是一个适配器容器。适配器:用已有的容器来创建新的容器,例如用vector就可以实现stack。在这里我们比没有直接用vector,而是用了一个模板Container,这样我们就可以通过传不同的容器来实现stack(默认给的容器是deque),这样就不仅限于只使用vector来实现。empty判断stack是否为空size返回stack的大小push插入一个元素,因为是stack,所以调用_con的尾插方法top返回栈顶元素pop出栈queue的主要成员变量queue也是
2022-06-21 16:38:26
316
原创 程序替换函数
如果我们要让子进程执行一个“全新的的程序”呢?就得使用进程替换技术。进程不变,仅仅替换当前的代码和数据,叫做进程替换,进程替换并没有创建新的进程,即子进程id并没有改变。只是替换了代码和数据。path:要执行的目标程序的路径arg:填入命令及其参数/可执行程序名…:可变参数列表,一般填NULL代码示例:这个程序替换的作用是:执行ls -a -l -n -i 命令。注意:execl()不但可以使用系统的命令,还可以使用自己写的程序,即在路径填自己写的可执行程序的路径。这个替换函数的使用与exec
2022-06-21 14:46:35
333
原创 #进程地址空间
在我们学习各种语言时,通常会听到内存会被划分成一下区域:我们以下面这份代码做一个实验:刚开始时,我们打印val的值和地址,因为子进程没有修改数据,所以父子进程共享一份代码,所以刚开始时,我们打印的值时一样的。但当cnt==3时,子进程修改了g_val的值,因此会发送写时拷贝,此时父子进程打印g_val的值和地址应该是不一样的。但结果会是我们设想的那样吗?运行结果后发现:g_val修改后,打印的值是不同的,但地址是相同的!为什么父子进程的g_val的值相同,地址却不同呢?因为语言程序所使用的空间不
2022-06-20 19:45:39
186
原创 vector的模拟实现
构造函数1、无参构造2、采用迭代器的构造方法3、拷贝构造赋值运算符重载析构函数reverse()扩容push_back当_finish == _endofstorage说明空间不够需要扩容。resize()inserterase剩余的简单成员函数正向迭代器反向迭代器方向迭代器的rbegin在正向迭代的end上,反向迭代器rend在正向迭代器的begin上。我们为反向迭代器新建了一个类...
2022-06-19 21:33:19
147
原创 C++之继承1
继承的概念继承(inheritance)机制是面向对象程序设计使代码复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print() { cout << "name:" << _name << endl; cout <<
2022-05-01 12:54:03
136
原创 Linux之make/makefile
make/makefile是什么?make是一条命令。makefile是一个文件,makefile包含了依赖关系和依赖方法。两个搭配使用,完成项目自动化构建,达到形成可执行程序的目的。make/makefile使用详情我们创建一个Makefile文件(makefile也行)如何vim编辑makefile文件依赖关系的另一种写法:$@代表目标文件、 $^代表源文件注意:伪目标不需要依赖关系,只需要依赖方法makefile自顶向下扫描命令,默认执行第一个命令,所有我们直接make,执行的就
2022-03-11 20:43:10
1814
1
原创 gdb调式工具的使用
使用前提gcc生成的可执行程序默认是release版本的,要调式,必须是debug版本,要生成debug版本要加-g 选项进入gdb调式工具gdb +可执行程序退出gdb在命令行输入“quit”显示行号第一次输入l或者list:由gdb决定在哪开始显示行号(大概率在main函数附近,显示10行),之后的每次 l 会在上一次的基础上增加显示10行l +行号:从这行开始显示行号l +函数名:从这个函数附近开始显示行号执行程序执行程序使用 ‘run’ 的命令(可以简写成 r)
2022-03-11 17:23:07
380
原创 C++之“模板”
场景引入当我们需要交换两个变量的值时,我们需要写一份交换函数代码。当是int类型时,我们需要写int类型的交换函数,当是double类型时,我们需要写double类型的交换函数…void Swap(int& x1, int& x2){ int x = x1; x1 = x2; x2 = x;}void Swap(double& x1, double& x2){ double x = x1; x1 = x2; x2 = x;}void Swap(
2022-03-06 23:20:40
196
1
原创 new/delete的底层-----operator new/operator delete
operator new与operator delete函数new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。operator new/operator delete是什么?operator new和operator delete就是对malloc和free的封装。我们知道malloc
2022-03-04 20:22:34
501
原创 malloc/free和new/delete的区别
对于内置类型malloc/free 和 new/delete 对于内置类型没有本质区别,只有用法上的区别int main(){ // 动态申请int和5个int数组 // 总结 malloc/free 和 new/delete 对于内置类型没有本质区别,只有用法上的区别 //mallloc要计算类型的大小 int* p1 = (int*)malloc(sizeof(int)); int* p2 = (int*)malloc(sizeof(int)*5); //new不用计算类型的大小
2022-02-27 09:45:09
1881
1
原创 Vim配置
说明我们在哪个用户配置Vim,就只能在那个用户下起作用,在其他用户下不起作用(包括root也不起作用,root也有自己的配置文件)方法一1.首先我们要确保自己在当前工作目录下,然后创建 .vimrc(在root账号创建 vimrc)2.然后用vim打开这个文件,我们发现刚开始的的vim是这样的:3.然后输入配置命令,我这里演示的是设置行号命令–set nu,然后保存退出,然后就可以显示行号(要配置更多的功能,去网上搜配置命令)方法二1.同样在工作目录下创建 .vimrc 文件2.在码
2022-02-19 23:16:35
203
原创 C++之析构函数
析构函数我们已知构造函数是完成初始化构造的,那又由谁完成资源的清理工作呢?这时析构函数应运而生。析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象的一些资源清理工作。语法:~类名(){ }何谓资源清理?在数据结构中,栈有以下的定义方式:class Stack{public: Stack(int capacity = 4) { _a = (int*)malloc(sizeof(int)*capacit
2022-02-17 10:50:24
650
原创 C++之构造函数(以Date类为例)
构造函数构造函数:完成初始化工作。当我们创建一个对象时,要为对象设置初始值。我们来看看下面这个没有构造函数代码,我们为对象设置初始值都要手动调用“SetDate”函数。class Date{ public: void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } void Display() { cout <<_year<< "-"
2022-02-16 20:20:16
1508
原创 C++之范围for循环
在以往我们遍历数组,通常是这样遍历的:void TestFor(){ int array[] = { 1, 2, 3, 4, 5 }; for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i) array[i] *= 2; for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p) cout << *p << en
2022-02-15 03:09:15
1023
原创 C++之auto关键字
auto的早期作用在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,所谓自动存储就是函数结束(出了作用域),这个变量自动销毁。这样的作用没有意义,因为现在的变量也是出了作用域就自动销毁。auto的这个用法就被消除了auto现在的作用C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得,简单来说就是由编译器来识别变量的类型。 int a = 10
2022-02-15 02:24:39
2029
原创 C++引用详解
引用的概念引用引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。语法形式:类型**&** 引用名=引用实体引用特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体void TestRef(){ int a = 10; // int& ra; // 该条语句编译时会出错,没有初始化 int& ra = a; int& rra = a; p
2022-02-14 21:03:35
141
原创 八大排序(附代码)
八大排序直接插入排序希尔排序选择排序堆排序冒泡排序快速排序归并排序计数排序直接插入排序令end=i,记录a[end+1]的值为x。若a[end]>x,则a[end+1]=a[end],end- -;当end减到小于0时,再让a[end+1]=x(如图,将降序成升序)。void InsertSort(int* a, int n){ for (int i = 0; i < n - 1; i++) { int end = i; int x = a[end + 1]; whil
2022-02-13 22:40:33
370
原创 栈的实现(数组栈)
一、前言本篇文章涉及顺序表的相关知识,如有不知何为顺序表的童鞋,请自行翻阅上篇博客---线性表之顺序表。二、什么是栈?栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO (Last ln First Qut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。由下图理解什么叫做后进先出原则。三、栈各个接口的实现...
2021-11-09 21:46:53
882
原创 线性表之顺序表
一、顺序表顺序表使用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。顺序表可以分为:1、静态顺序表:使用定长数组存储元素。#define N 100typedef int SLDataType;typedef struct SeqList{ SLDataType a[N]; int size;//数据个数}SL;2、动态顺序表:使用动态开辟的数组存储。typedef int SLDataType;typedef struct Se.
2021-11-04 19:51:33
96
原创 程序的编译与预处理详解
目录一、程序的编译1、 编译阶段2、链接二、预处理详解1、预定义符号2、#define定义的标识符3、#define定义的宏4、#undef一、程序的编译我们写的源文件(*.c)是经过怎样的处理生产可执行文件(*.exe)的呢?这种处理有两个步骤—编译和链接。源文件在编译阶段通过编译器将每个源文件转换为目标文件(这些文件是可执行的机器指令),再通过链接器将其捆绑到一起,生成一个完整的可执行程序。1、 编译阶段编译阶段可细分为3个阶段:预处理(即预编译)、.
2021-10-12 15:28:14
1831
1
原创 C语言文件操作
目录一、什么是文件二、文件缓冲区三、文件指针四、文件的打开和关闭。一、什么是文件在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。程序文件:包括源程序文件(后缀为.c ),目标文件( windows环境后缀为.obj ) ,可执行程序( windows环境后缀为.exe )。数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件或者输出内容的文件。数据文件又分为”文本文件“和”二级制文件“二进制文件:
2021-10-10 22:44:39
468
1
原创 动态内存分配的相关函数
目录一、前言二、malloc和free1、malloc()函数2、free()函数三、calloc四、realloc函数五、常见的动态内存错误一、前言为什么需要动态内存分配?当我们创建数组时,如:int val=20;int arr[20]={0};数组开辟的内存是固定的,而实际过程中,有时候我们是无法预知程序所需要的空间大小,内存要是开辟大了,浪费空间,开辟小了,程序出错。这就需要一种方法来灵活控制开辟空间的大小,在这种时候,我们就需要用到动态内存。
2021-10-10 15:04:11
663
原创 自定义类型:结构体,枚举,联合体
一、结构体1、结构体的声明结构体常见的声明方式有三种,如:1、struct stu{ char name[20]; int age; char sex[5]; char id[20];};2、struct stu{ char name[20]; int age; char sex[5]; char id[20];}s1,s2;3、typedef struct stu{ char name[20]; int age; char sex[5]; ch..
2021-10-09 15:34:22
377
原创 c语言库函数及其实现
目录一、strlen函数1、定义2、strlen的易错点3、strlen的三种模拟实现方式二、strcpy函数1、定义2、strcpy的模拟实现。三、strcmp函数1、定义2、strcmp的模拟实现四、strstr函数1、定义2、strstr的模拟实现五、strcat函数1、定义2、注意事项六、memcpy函数1、定义2、memcpy模拟实现七、memmove函数1、定义2、memmove函数模拟实现...
2021-10-02 17:20:06
1045
原创 函数栈帧的创建过程
目录一、预备知识1、寄存器二、栈帧的使用三、函数栈帧的创建过程一、预备知识1、寄存器常用的寄存器有:eax、ebx、ecx、edx、ebp、esb。其中ebp、esp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。ebb指向栈底,也称栈底指针;esp指向栈顶,也称栈顶指针。二、栈帧的使用栈帧的开辟过程中,先使用高地址,再使用低地址。放元素进去叫压栈。让元素出来叫出栈三、函数栈帧的创建过程首先我们用一个简单的代码来观察函数栈帧的创建过程。(提示下面出现的
2021-08-31 04:06:02
585
原创 数据的存储
目录一、预备知识1、原码、反码与补码2、大小端介绍二、整数在数据中的存储三、浮点数的存储一、预备知识1、原码、反码与补码有符号数的有三种表示方法,即:原码、反码、补码;这三种表示方法均有符号位与数值位,最高位的那一位就是符号位,用0表示正数,1表示负数。正数的原、反、补码都相同原码:直接将二进制按正负数的形式翻译成二进制就可以。补码:将原码的符号位不变,其他位依次按位取反就可以了。补码:反码+1就是补码2、大小端介绍大端模式:数据的低位保存在内存的高.
2021-08-30 21:18:30
309
原创 扫雷游戏(C语言)
一、基本设计思路1、创建两个字符数组我们创建的两个字符数组,一个用于设置雷的位置,一个用于用户的展示。那么我们为什么要创建两个数组,而不是一个数组呢?是因为当我们创建一个数组时,我们既要把雷的信息放进去,当我们扫雷的时候,又要把周围雷的个数的数字展示给用户,因此要把整个数组的内容展示给用户,那么我们又怎么展示的时候把雷的信息给隐藏呢?而且当我们用1表示雷,0表示不是雷时,当周围只有一个雷时,那么我们得把我们扫的那个位置改成“1”,那么这样展示的时候就会有歧义了。这个“1”,到底是表示雷呢?还是表示周
2021-08-04 10:17:51
152
原创 三子棋代码及讲解
一、问题C语言实现三子棋游戏二、代码的步骤1.创建菜单页面2.初始化棋盘函数。3.显示棋盘函数4.实现玩家下棋的函数5.实现电脑下棋的函数6.实现判断输赢、平局的函数三、代码的具体实现1.使用宏定义定义三子棋的行和列。#define ROW 3#define COL 32.main函数的具体实现int main(){ srand((unsigned int)time(NULL)); int input = 0; do { menu.
2021-07-31 17:54:47
205
原创 vs编译器scanf报错解决方法
在我们使用vs编译器时,使用scanf函数,编译器会报错,提示我们要使用scanf_s函数。如:这是因为vs编译器觉得scanf函数不安全,而需要使用自己创建的scanf_s函数(可能微软公司要特立独行一点)。如果我们偏偏要使用scanf函数改怎么解决呢?我们只需要在文件的第一行加上 #define _CRT_SECURE_NO_WARNINGS 这句话即可。那么我们每一次写程序都要加上这一句话会不会太麻烦呢?有没有一创建文件,默认给我们写上这一句话的方法呢?当然有。首先我们...
2021-07-25 14:08:27
791
原创 C语言基础知识
目录C语言常见的数据类型C语言常见的数据类型char 字符数据类型 short 短整型 int 整型 long 长整型 long long 更长的整型 float 单精度浮点数 double 双精度浮点数 那么这些数据类型的大小是多少呢?在此之前,我们得先认识计算机采取的是二进制,计算机中的单位有bit、byte(等于8个bit)、kb(等于1024byte)等,列如:4的二进制是100,则
2021-07-25 13:37:47
828
2
原创 菜鸟的学习之路
菜鸟的学习之路目录菜鸟的学习之路自我介绍编程目标学习计划与目标自我介绍CSDN的伙伴们,大家好!我是来自湖南的一名大二的学生,就读软件工程专业。从今天开始,我将在这里分享我的“学习历程”,我将以最浅显语言来写我的每一篇博客,争取让每一个小白能看懂每一份程序,每一行代码。希望大家也能紧跟我的脚步,让我们从零基础开始,从菜鸟蜕变成大神吧!编程目标学习计划与目标...
2021-06-03 14:02:50
440
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人