自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

sun

学习笔记

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

原创 QT自定义信号槽

2.信号就是一个个的函数名,返回值是 void(因为无法获得信号的返回值,所以也就无需返回任何值),参数是该类需要让外界知道的数据。信号作为函数名,不需要在 cpp 函数中添加任何实现。 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外); 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响; 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;

2024-08-17 17:15:39 387

原创 C++中成员函数的重载覆盖与隐藏

成员函数被重载的特征:在同一个类中,函数名相同,参数不同,vritual关键字可有可无。:覆盖是指派生类函数覆盖基类函数,特征是:在有继承关系的类中,函数名相同,参数相同,基类必须有vritual关键字。

2023-10-18 20:15:03 162

原创 C++ 多文件编程中,处理“多次 #include 导致重复引入”问题

重复引入

2023-10-17 11:23:45 575

原创 新安装的linux部分功能安装

linux

2023-03-03 23:28:16 153

原创 迭代器失效问题

数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后在iter++,是没有意义的。链表型数据结构:对于list型的数据结构,使用了不连续分配的内存,删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.解决办法两种,erase(*iter)会返回下一个有效迭代器的值,或者erase(iter++).

2022-09-05 09:28:57 419 1

原创 C/C++编译链接过程

C和C++转化成计算机语言主要经理四个过程:预编译,编译,汇编,链接读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令主要包括以下四个方面:宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串被替换。...

2022-09-01 10:02:50 348

原创 朴素算法BF,KMP算法

朴素算法//朴素算法 BF算法 :1.同时向后跑 2.如果相等i++ j++ 3.如果不相等i=i-j+1 j=0 int BF_Search(const char* str, const char* sub, int pos)//从主串的pos下标开始向后找字串{ assert(str != NULL && sub != NULL && pos >= 0 && pos < strlen(str)); if (str == NULL

2022-03-16 14:56:25 365

原创 BST树相关函数

#include<stdio.h>#include<assert.h>#include<iostream>#include<Windows.h>#include<queue>using namespace std;// map rb_tree;//树的结构typedef int KeyType;typedef struct BstNode{ KeyType key; BstNode* leftchild; BstNode*

2022-03-12 02:37:26 536 2

原创 二叉树遍历

二叉树数据结构typedef char Elemtype;typedef struct BtNode{ Elemtype data; struct BtNode* leftchild; struct BtNode* rightchile;}BtNode,*BinaryTree;二叉树中序遍历 递归//中序遍历void InOrder(BtNode* p)//ABC##DE##F##G#H##{ if (p != NULL) { InOrder(p->leftchild

2022-03-07 01:05:30 495

原创 生产者和消费者-代码

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<pthread.h>#include<semaphore.h>#define BUFF_MAX 10#define SC_NUM 2#define XF_NUM 3int buff[BUFF_MAX];int in=0;int out=0;sem_

2021-12-01 22:33:35 581

原创 STL迭代器-使用方法

顺序迭代器——遍历型迭代器1.iterator 正向迭代器常迭代器//函数模板,正向打印容器内元素template<typename CON>void show(CON& src){ typename CON::iterator it = src.begin(); for (; it != src.end(); it++) { cout << *it << " "; } cout << endl;}2.reverse_

2021-11-26 22:06:42 379

原创 STL容器介绍以及使用

个人总结如果有错误欢迎指正什么是容器?如果你学过c语言,那就很简单了,容器就像是数组这种存数据的一种结构,容器在申请的时候也需要指明要存储的数据类型,你只需要通过函数对其插入或者取出数据。一.近容器近容器的概念很简单像数组,string这些可以存储数据的结构称为近容器二.顺序容器vectorvector是向量类型,可以容纳许多类型的数据进行vector操作前应添加头文件#include 扩容方式按照1.5倍扩容初始化方式vector a(10) ;

2021-11-26 19:06:57 585

原创 c++泛型算法,函数对象

目录泛型算法1.copy:2.find:3.sort()(用到函数对象)//从小到大排4.greater()//从大到小排5.find_if函数对象(和泛型算法结合使用)1.less2.greter3.binder1st4.binder2nd泛型算法使用到的头文件#include<algorithm>#include<functional>1.copy:实现对IT类型中对象的拷贝,第三个参数使用了插入型迭代器.

2021-11-26 08:43:06 157 2

原创 MVC模式

#include<iostream>using namespace std;enum Type{ INSERT, SELECT, UPDATA, DELECT};class View{public: virtual void process(int a) = 0;};class View_insert:public View{ void process(int a) { cout << "insert" << endl; }}.

2021-11-18 19:01:47 92

原创 udp实现客户端服务器

服务器端:#include<stdio.h>#include<assert.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>//服务器端int main(){ int sockfd=socke

2021-11-14 16:33:38 2601

原创 tcp服务器和客户端代码实现

服务器编程流程:int socket() 创建一个socket返回值:出错返回-1 成功返回socket文件描述符int bind() 命名绑定,确定IP+port 只有在命名之后客户端才知道如何连接它返回值:失败返回-1 成功返回0进行绑定步骤时要进行主机字节序和网络字节序的转换和IP地址点分十进制的字符串类型和整型值之间的转换int listen() 启动监听 ,socket命名绑定了之后还不能马上接受客户的链接,需要先启动监听来创建一个监听队列用于存放待处理的客户链接,连接队列的大小最

2021-11-14 15:21:55 2386

原创 进程间的通讯

进程间的通讯IPC:管道,信号量,共享内存,消息队列,套接字管道(有名管道和无名管道)有名管道有名管道可以在任意两个进程之间通信有名管道的创建:◼ 命令创建: mkfifo FIFO◼ 系统调用创建...

2021-08-21 18:58:12 86

原创 信号量:三个进程 a、b、c 分别输入“A”、“B”、“C”,要求输出结果必须是“ABCABCABC…”

sem.h#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/sem.h>#include<string.h>union semun{ int val[3];};void sem_init();int sem_p0();int sem_p1();int sem_p2();int sem_v0();int sem_v1();int

2021-08-21 14:44:26 417 1

原创 linux命令源码

pwd#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ char path[256]={0}; getcwd(path,256); printf("%s\n",path);}ls#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<s

2021-08-16 21:07:17 779

原创 mybash

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/wait.h>#include<pwd.h>//获取用户名#define PATH "/home/stu/c215/mybin/"#define MAX_ARG 10void print_info(){ //printf("\033[1;32

2021-08-16 21:04:50 176

原创 信号的使用

1、信号的基本概念信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。与信号有关的系统调用在“signal.h”头文件中有声明2、修改信号的响应方式 – signal()三种响应方式3、发送信号 – kill()kill() 可以向指定的进程发送指定的信号:int kill(pid_t pid, int sig);pid > 0 指定将信号发送个那个进程pid == 0 信号被发送到和当前进程在同一个进程组的进程pid == -1 将信号发送给系统上有权限发送的所

2021-08-15 18:26:11 220

原创 替换进程exec

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>int main(int argc,char*aargv[],char*envp){ char*myargv[10]={"ps","-f"}; printf("main run pid=%d\n",getpid()); //execl("/usr/bin/ps","ps","-f",(

2021-08-15 17:21:28 72

原创 复制文件.

#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<unistd.h>#include<fcntl.h>int main(int argc,char* argv[]){ if(argc!=3) { printf("arg err\n"); return 0

2021-08-14 17:33:46 183

原创 linux文件操作

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<assert.h> #include<string.h> #include<fcntl.h> int main() { int fd =open("a.txt",O_RDONLY);//读出文件内容 assert( fd != -...

2021-08-14 17:31:20 55

原创 僵死进程及处理方法

(1) 僵死进程概念:子进程先于父进程结束,父进程没有调用 wait 获取子进程退出码。(2) 如何处理僵死进程:父进程通过调用 wait()完成。(3) Init 进程收养孤儿进程(即1号进程)当子进程结束后,并没有消失,仍然可以在系统中观测到,但此时子进程其实已经运行结束了,此时子进程的状态被称为僵死状态,系统把处于该类状态的进程称为僵死进程。 如果父进程先结束,子进程最后是不会变为僵死进程的。...

2021-08-14 15:07:19 670

原创 Linux 进程复制与替换

Linux 进程复制与替换1、printf 函数输出问题printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满足,才会输出到屏幕。1) 缓冲区满2) 强制刷新缓冲区 fflush3) 程序结束时#include <stdio.h> #include <stdlib.h>#include <unistd.h> int main(int argc, char* argv[],char* envp[]) { printf("

2021-08-12 21:27:55 59

原创 linux关于fork面试题

下列程序输出几个“A”?代码一:int main(int argc, char* argv[],char* envp[]){ int i = 0; for( ; i < 2; i++ ) { fork(); printf("A\n"); } exit(0); }代码二: int main(int argc, char* argv[],char* envp[]) { int i = 0;

2021-08-12 21:12:21 123

原创 Linux计算机基础概论

计算机的基本组成1.1 计算机组成五大部件(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。(2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。(3) 存储器 :存储程序和各种数据。(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。

2021-08-11 18:55:20 135

原创 指针函数.

打印不同个数字符串#include<assert.h>#include<stdlib.h>void* PrintInt(const void* p){ int* ip = (int*)p; printf("%d ", *ip); return (void*)(ip + 1);}void* PrintDouble(const void* p){ double* dp = (double*)p; printf("%f ", *dp); return (vo

2021-07-25 13:32:30 73

原创 联合体的巧妙实用

sprintf_s(),sscanf_f()的使用十进制数和IP地址的相互转化十进制数转化成IP地址字符串#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>union IPNode{ int addr; unsigned char s[4];};void Uint_To_Str2(char* buff, int len, unsigned int

2021-07-23 16:58:39 77

原创 Linux基本命令

1. 常见目录说明/bin 存放常用命令(即二进制可执行程序)/etc 存放系统配置文件/home 所有普通用户的家目录/root 管理员用户的家目录/usr 存放系统应用程序及文档/proc 虚拟文件系统目录,以进程为单位存储内存的映射/dev 存放设备文件/mnt 临时挂载点/lib 存放库文件/boot 系统内核及启动有关的文件/tmp 存放各种临时文件,是所有用户均可访问的地点/var 存放系统运行中常改变的文件, 如系统日志2、绝对路径与相对路径绝对路径: 是从系统根目

2021-07-22 21:11:14 373

原创 位运算以及计算题

1.可以进行位运算的类型char int short long int long long 无论有符号还是无符号都可以不可以进行位运算的类型float double long double 指针2. & 位与 非零即为真 只有都为1才为| 位或 有一个1即为真^ 异或 相异为1~ 未返 c=0001 1000 ~c=1110 01113.有关于位运算的题只能针对于 un

2021-07-11 00:12:29 143

原创 中值法查找数

int Binafindval(const int* br, int n, int val){ assert(br != nullptr); int right = n - 1, left = 0; int pos = -1; while (left<=right) { int mid = (right - left) / 2 + left; if (br[mid] < val) { left = mid + 1; } else if (br[mid] &g

2021-06-14 19:33:26 250

原创 递归函数初识

斐波那契数列int fac(int n) //时间复杂度较高{ if (n <= 2) { return 1; } else { return fac(n - 1) + fac(n - 2); }}int main(){ int n; scanf_s("%d", &n); int sum = fac(n); return 0;}用递归找数组中的数int FindValue(int* br, int n, int val){ assert(br

2021-06-08 16:49:43 69

原创 拷贝,链接函数

拷贝#include<stdio.h>#include<assert.h>//数据不动下标动的左右移void my_memcpy(char* dest, const char* src){ assert(src != nullptr); while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0';}int main(){ char ar[30] = { "bcusy" }

2021-06-07 23:10:56 67

原创 杨辉三角打印

#include<stdio.h>#define N 11void Yanghui(int n){ int ar[N][N] = {0};//多开一行使得其整体可以满足ar[i][j] = ar[i - 1][j] + ar[i - 1][j - 1] ar[0][0] = 1;//该数不打印 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { ar[i][j] = ar[i - 1]

2021-05-31 12:17:15 91 1

原创 数组中的数左右移动

第一种方法:先写出单个移动函数然后重复调用void Right_Move(int* br, int n)//右移函数{ assert(br != nullptr); int tmp = br[n - 1]; for (int i = 9; i > 0; --i) { br[i] = br[i - 1]; } br[0] = tmp;}void Left_Move(int* br, int n)//左移函数{ assert(br != nullptr); int tmp

2021-05-29 03:22:25 238

原创 产生随机值1-100并且不重复***(用了查表法)

void Init_ar(int* br, int n)//初始化函数{//srand(time(NULL));int cr[101] = {};int i = 0;while (i < n){br[i] = rand() % 100 + 1;if (cr[br[i]] == 0){cr[br[i]] = 1;++i;}}}void manpao_ar(int* br, int n)//冒泡排序方便检查{assert(br != nullptr);for (int

2021-05-27 00:20:12 86

原创 const和指针

int i=10;int x=10;int *p=&i;//普通指针int const *p=&i; //封锁指向概念 (*p=1000这样是不允许的)p=&x可以int const p=&i; //修饰指针自身p=1000这样是允许的)p=&x不可以const int * const p=&i;//全封锁...

2021-05-20 17:08:22 46

原创 越界检查

int FindValue(int* br, int n, int val){if (br == nullptr || n < 1) return -1;int i = 0;int pos = n-1;while (pos >= 0 && br[pos] != val)//pos>=0当这条件不符合时后面的条件将不会再执行while ( br[pos] != val&&pos >= 0){–pos;}return pos;for

2021-05-20 15:39:15 226

空空如也

空空如也

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

TA关注的人

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