自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 8位bmp文件获取像素

C语言读取8位bmp文件的像素点

2022-08-30 13:22:03 910 2

原创 云备份项目

1. 项目名称:云备份2.项目简介:https://github.com/fangbaorui/Linux/tree/master/src搭建云备份服务器与客户端程序组成一套系统。实现客户端对主机上指定目录下需要备份的文件进行自动备份上传。服务器端会对上传的文件进行备份存储,对于非热点文件进行压缩存储节省磁盘空间,并且服务器端支持通过浏览器进行查看与下载以及断点续传功能。3.项目特点:http服务器,线程池,读写锁,bundle库中的lz压缩。4.概要设计客户端模块: window

2021-08-19 13:51:17 286

原创 点餐系统项目

项目名称:点餐系统1. 项目描述使用户可以通过访问浏览器与服务器进行交互,获取菜品信息并进行点餐,以及可以使管理员通过浏览访问服务器实现订单和菜品的管理。2.市场调研给毕设准备的项目。3.技术调研线程、socket、http、stl、MySQL、HTML、CSS、Vue.js、Ajax。4.项目实现整体框架采用了不太严谨的MVC框架,将项目实现整体分为三个模块:数据管理、业务管理、前端页面。4.1数据管理模块:基于MySQL数据库实现数据存储管理,并且封装数据库访问类,

2021-07-14 22:44:47 1474

原创 设计一个类,不能被继承

C++98方式:C++98中构造函数私有化,派生类中调不到基类的构造函数,则无法继承。//基类的构造函数定义为私有的class C{private: C() {}};class D :public C{};void test(){ //D d;}C++11方法:final关键字,final修饰类,表示该类不能被继承。//不能被继承的类//把类定义为final类class A final{};class B :public A{};...

2021-06-21 22:41:49 163 2

原创 设计一个类,只能在栈上创建对象

方法一:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。//设计一个类,只能在栈上创建对象class StackObj{public: //公有的静态方法创建对象返回即可 static StackObj getObj() { return StackObj(); } //构造函数私有private: StackObj() {}};//全局的,在数据段StackObj so = Sta

2021-06-21 22:37:19 131

原创 设计一个类,只能在堆上创建对象

实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。//设计一个类,只能在堆上创建对象class HeapObj{public: //提供一个静态的成员函数调用构造函数创建对象 static HeapObj* getObj() { return new HeapObj; } //禁止构造函数的调用:私有private: HeapObj() {} //防拷贝 //只声明不实现(c

2021-06-21 22:28:24 91

原创 关联式容器multimap

1. multimap的介绍multimap的介绍Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key, value>,其中多个键值对之间的key是可以重复的。在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:typedef pair&l

2021-05-28 20:50:44 138

原创 关联式容器map

1. map的介绍map的介绍map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类value_type绑定在一起,为其取别名称为pair:typedef pair value_type;在内部,map中的元素总是按照键值key进行比较排序的。map中通过键值访问单个

2021-05-27 22:51:47 130

原创 关联式容器multiset

1. multiset的介绍multiset的介绍multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定

2021-05-26 21:03:17 111

原创 关联式容器set

1. 关联式容器关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。2. 键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。SG

2021-05-26 20:39:56 106

原创 二叉搜索树的使用

1 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树2 二叉搜索树概念#include<time.h>#include<iostream>using namespace std;template <class T>struct BNode{ T _data

2021-05-14 22:58:50 120

原创 二叉搜索树

1 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树int a [] = {5,3,4,1,7,8,2,6,0,9};2 二叉搜索树操作二叉搜索树的查找二叉搜索树的插入插入的具体过程如下:a. 树为空,则直接插入b. 树不空,按二叉搜索树性质查找插入位置,插入新节点二叉搜索树的删除首

2021-05-13 22:42:38 138

原创 双端对列(deque)的介绍和使用

1. deque的原理介绍deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因

2021-04-21 20:11:55 393

原创 优先对列(priority_queue)的介绍和使用

1. priority_queue的介绍priority_queue文档介绍翻译:优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器

2021-04-21 15:14:33 327

原创 C++模拟实现队列

1. 队列的介绍queue的文档介绍翻译:队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用bac

2021-04-21 14:29:31 330

原创 进程状态

1.进程状态的作用用于操系统对进程的管理(什么状态该对进程进行什么样的操作)。2.进程状态的分类R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。T停止状

2021-04-17 11:30:17 129

原创 创建进程

1.创建进程的概念进程就是一个PCB是一个task_struct结构体(linux中),创建一个进程实际上就是创建了一个task_struct结构体。pid_t fork(void)–创建进程的接口—通过复制调用这个接口的父进程,创建一个新的子进程。创建进程是整体复制,只是因为程序计数器保存的位置是创建子进程成功之后的指令,因此复制过来之后紫禁城是从这个开始运行的。2.通过系统调用获取进程标识符:进程id(PID) 2.父进程ID(PPID)#include <stdio.h&g

2021-04-17 10:52:16 306

原创 进程概念,了解PCB

1.如何理解“管理”管理的例子描述被管理的对象组织被管理的对象2.计算机管理硬件描述起来,用struct结构体组织起来,用链表或其他高效的数据结构3.系统调用和库函数概念系统调用接口:操作系统向上提供的访问系统内核的接口库函数:库函数封装了系统调用接口,他们是上下级调用的关系4.进程概念概念:运行中的程序,但是在操作系统角度进程是PCB——进程控制块,在linux下是一个task_struct结构体,是一个程序动态运行的描述为什么:因为操作系统需要通过这些描述实现对

2021-04-17 10:29:03 130

原创 使用Linux上传文件到github

1. 使用git命令行安装git命令sudo yum install git2. 使用github创建项目登陆成功后, 进入个人主页, 点击 New repository创建新仓库获取地址,复制链接3. 下载项目到本地创建好一个放置代码的目录git clone 上步复制的地址链接将代码放到刚才下载好的目录中git add [文件名]提交,并且对代码描述,双引号之间填写描述的信息git commit -m " "同步到远端服务器上git p

2021-04-15 23:27:18 125

原创 栈(stack)的介绍和使用

1. stack的介绍和使用1.1 stack的介绍stack的文档介绍翻译:stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判

2021-04-12 11:30:38 1404

原创 C++List模拟实现

1. list的介绍及使用1.1 list的介绍list文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行

2021-04-10 11:37:49 59

原创 vector的使用

1.vector的使用vector学习时一定要学会查看文档:vector的文档介绍,vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。2.vector的定义// constructing vectors#include <iostream>#include <vector>int main (){ // constructors used in the same order as described above:

2021-04-01 15:02:17 53

原创 vector的介绍与模拟实现

1.vector的介绍及使用1.1 vector的介绍vector介绍1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就

2021-03-30 17:24:11 161

原创 C++函数模板

1. 泛型编程如何实现一个通用的函数模板呢?void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }void Swap(double& left, double& right) { double temp = left; left = right; right = temp; }void Swap(char& left, char& r

2021-03-23 16:29:51 50

原创 C++11auto关键字

1. auto简介在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量。C++11中,标准委员会赋予了auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。void test(){ //auto:自动类型推导 auto a = 10; auto b = 2.0; auto c = 'a'; auto d = 'a' + b; cout << typ

2021-01-31 16:27:50 130

原创 C++内联函数

1. 内联函数概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。1.1 不使用内联函数的反汇编代码1.1 使用内联函数的反汇编代码2. 内联函数特性inline是一种以空间换时间的做法,省去调用函数的额外开销,所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。i

2021-01-31 15:55:25 56

原创 C++引用

1. 引用的概念1.1 引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开存储空间它和它引用的变量共用同一块内存。类型& 引用变量名(对象名)=引用实体#include<stdio.h>int main(){ int a = 10; int& ra = a; //定义引用类型 printf("a = %d\n", a); //10 printf("ra = %d\n", ra); //10 printf("a的地

2021-01-30 20:35:24 53

原创 缺省参数

1. 缺省参数概念1.1 缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。void fun1(int a){ cout << a << endl;}void fun2(int a = 10){ cout << a << endl;}void test(){ fun1(100); //100 fun2(); //10,没有传参时,使用参数的默认值 fun2

2021-01-29 19:24:27 172

原创 C++命名空间

1.命名空间的作用1.1 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。2.命名空间的定义2.1 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

2021-01-29 17:16:33 44

原创 C语言写顺序表

1. 顺序表的结构(1) 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。2. 顺序表的特点(1)空间连续。(2)支持随机访问。(3)尾插尾删操作时间复杂度都是O(1)。(4)其他位置(除过尾部)插入删除都是0(n)。(5)空间利用率高,不容易造成内存碎片。(6)适合访问存储。(7)增容代价大,增容一般是呈2倍增长,势必会有一定的空间浪费。(8)增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。3.顺序表的实现

2020-12-28 21:40:15 267

原创 模拟实现字符串函数strlen,strcpy,strcat,strcmp

&一.求字符串长度(strlen)&二.长度不受限制的字符串函数(strcpy,strcat,strcmp)&三.长度受限制的字符串函数介绍(strncpy,strncat,strncmp)&四.字符串查找(strstr,strtok)1.求字符串长度(strlen)(string length)(字符串通常放在常量字符串中或者字符数组中,字符串常量适用于那些对它不做修改的字符串函数)size_t strlen ( const char * str );1)字符

2020-12-05 16:19:57 281

原创 C语言:strlen模拟实现->求字符串长度

模拟实现strlen,求字符串长度(方法一)识别字符串中的每个字符,如果不是’\0’,计数器count++,直到找到’\0’为止,返回计数器coun的值#include<stdio.h>#include<assert.h>size_t my_strlen(const char* str){ assert(str != NULL);//断言str不是空指针 int count = 0;//计数器 while (*str != '\0') { count++;//每

2020-12-02 19:50:26 301

原创 模拟实现快速排序

快速排序(qsort)可以排任意类型的数据例题#include<stdio.h>#include<stdlib.h>#include<string.h>struct Stu{ char name[20]; int age;};int int_cmp(const void* elem1, const void* elem2)//整型比较{ return *(int*)elem1 - *(int*)elem2;//void类型无法直接解引用,先强制

2020-11-26 22:29:21 214

原创 函数指针

1.函数指针(1)函数指针就是指向函数的指针,函数名就是函数的地址,&函数名还是函数的地址,先看看下面一段代码你就明白了。函数指针类型如 int (*p)()//函数指针//函数指针是指向函数的指针,函数名是函数的地址,&函数名还是函数的地址。#include<stdio.h>void test(){ printf("hehe\n");}int main(){ printf("%p\n", test);//函数名是函数的地址 printf("%p\n

2020-11-25 22:01:03 77

原创 猜名次推理题

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。#include<stdio.h>int main(){ int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; for (a = 1; a <= 5; a++)

2020-11-24 12:03:04 329

原创 找凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词:A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。#include<stdio.h>int main(){ int killer = 'A'; //假设第一个人士凶手,判断每个人说的话,然后在判断第二个人,直到找到符合的 for (killer = 'A'; killer <= '

2020-11-23 23:48:08 104

原创 C语言打印杨辉三角

//打印杨辉三角#include<stdio.h>int main(){ int arr[10][10] = { 0 }; int i = 0; int j = 0; //对角线元素置1,第一列置1 for (i = 0; i < 10; i++) { arr[i][0] = 1 ; arr[i][i] = 1 ; } //第三行第二列元素等于第二行第二列元素+第二行第一列元素,之后部分值也这么求 for (i = 2; i < 10; i++)

2020-11-23 23:46:19 132

原创 C语言求两数最小公倍数

方法一:输入两个值让a为较小值,让i从a到1计算,当a%i与b%i同时为0时,则i为最大公约数#include<stdio.h>int main(){ int a = 0; int b = 0; int temp = 0; scanf("%d %d", &a, &b); if (a > b) { temp = a; a = b; b = temp; } int i = 0; for(i = a; i >1; i--) {

2020-11-22 21:45:22 680

原创 C语言求两数最小公倍数

求最小公倍数方法一:给两个数A,B,让A和i相乘(i从1到B),每一次去模B,如果不等于0,然后i+1,直到等于0就找到了#include<stdio.h>int main(){ int a = 0; int b = 0; int i = 1; scanf("%d %d", &a, &b); while (((a * i) % b )!= 0) //等于0就退出循环,就找到了 { i++; } printf("%d\n", (a * i)); ret

2020-11-22 21:40:48 6288

原创 结构体内存对齐与修改默认对齐数

结构体内存对齐规则:1.第一个成员的偏移量从结构体0偏移处开始。2.其他成员变量要对齐到自身对齐数的整数倍的地址处。对齐数=编译器默认对齐数与该成员大小的较小值。vs默认对齐数为83.结构体大小为最大对齐数的整数倍。4.嵌套结构体的大小为:嵌套的结构体对齐到自己最大对齐数的整数倍,结构体的大小就是所有对齐数(包含嵌套中的对齐数)的整数倍。//下面两个结构体, 在#pragmapack(4)和#pragmapack(8)的情况下,结构体的大小分别#pragma pack(4) //默认对齐数修

2020-11-21 16:07:39 468

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除