自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 多线程detach问题

实际上就是因为std::ref(num),这个转换发生在主线程结束之前,还是之后。如果发生在结束前,val结果就正常。如果发生在结束后,val值就是一个UB。运行可知,num的地址和val的地址不同,两个变量明显不是同一块内存。可是我本意目的就是要这个UB,但发现主线程中数据并没有发生改变。由于引用这个东西,本能的我就想到是因为引用的引用,导致这个问题。昨晚无意间敲少敲了&引用,于是出现了子线程中值UB的问题。线程如果先结束,回收num,val还是会改变。于是各种试验,反汇编,查询无果。

2023-05-09 13:49:58 234 1

原创 C++可变参数宏

C++可变参数宏

2023-04-28 11:43:42 197

原创 C++真是一门...的语言

发现结果和想象中的不一样,我以为这个after表示的是在fl的迭代器后插入。到这里,瞬间感觉为了迎合一个before_begin,真是不容易啊。于是就特别费解,明明都是左闭右开的形式。突然出现一个左开右开的形式。一直都没有发现,今天偶然用了一下forward_list。在要一个链表插入到另一个链表时使用splice_after。原来他是fl2.begin()的后一个开始插入。看到还有其他形式于是试了一下。

2023-03-28 17:47:45 206

原创 C++ 中new的使用(new operator, operator new, placement new)

不知道有没有一直看下来的,接下来就是网络编程,然后lua,数据库。再搞源码,操作系统(视频很多跟着敲一下大概了解就可以了), stl, 智能指针。然后服务器,性能,负载。然后简单的看下设计模式,刷刷OJ,996就向你招手了。c++ primer一定要翻一遍,面试的时候稍微有难度的问题回答的不好。态度好一点,虚心点反而不是问题,反而基础问题没有回答上来基本拜拜。尤其大厂。...

2022-07-11 10:23:07 430

原创 代码管理工具-git

概述代码协同管理工具常用的有snv, git分布式git每个结点都保存完整代码,没有统一的中央服务器,结点之间相互推送下载代码完成共享集中式svn代码集中管理,每次完成代码上传到中央服务器管理,然后统一从中央服务器下载使用多人协同开发备份,防止代码丢失版本管理,多个版本之间进行跳跃多人代码共享传输多人开发,各种模式,方便代码管理git特点...

2021-12-23 09:51:29 180

原创 Linux系统编程-线程二

线程同步就是线程间相互协同(协助),相互配合完成某个工作.根本在于协同步调,按照预定先后次序运行其实就是一个线程返回,另一个线程开始.不然会造成数据混乱数据混乱原因线程间资源共享(当然独享的不会)线程间调度时随机的线程间缺少必要的同步机制(协同,步调)共享和随机不能改变,只能通过协同来着手,使线程出现互斥互斥锁mutex公共数据时,锁会阻塞,哪个线程有锁哪个线程执行但是这个锁叫建议锁,没有强制性.也就是说可以不拿锁,直接去访问数据.只能程序员来指定在访问公共数据时,先去拿锁

2021-12-20 18:50:50 150

原创 Linux系统编程-线程

线程线程是一个轻量级的进程,本质还是进程(Linux下)(其实可以把它就当成一个回调函数)一个进程分为N个线程,最少有一个线程(例如hello world可以成为单线程程序)线程是调用CPU调度的单位(进程是分配系统资源),线程是最小的执行单位,进程是最小的分配资源单位线程有独立的PCB,但没有独立的地址空间(共享地址空间)而进程有独立的地址空间独立的PCB.(线程依赖于进程,所有线程共享进程资源)线程也叫轻量级进程(light weight process),有自己的PCB,创建线程使

2021-12-13 19:29:04 1224

原创 Linux系统编程-守护进程

概念进程组一个进程组有多个进程进程组PID为第一个进程PID,称为组长进程会话一个会话有多个进程组一个会话可以有一个控制终端建立与控制终端链接的进程称为控制进程(会长进程)进程ID 进程组ID 会话ID 都一样的谁控制终端谁就是前端进程组,否则就是后端进程组创建会话调用进程不能是进程组的组长,该进程变成新会话的首进程(会长进程),原因很简单该进程的PPID和它的子进程PID一样(会话是一个新的组),当然如果调用的也会出错该进程称为组长,也称为会长需要root权限(Ubun

2021-12-07 18:31:22 375

原创 Linux系统编程-信号

概念(我比较懒,大部分纯属个人理解,非标准)信号简单不能携带大量信息需要满足特定条件才会发送信号发出接收者会立即停止处理信号,处理结束在执行后续指令.它是软中断,并不是真正的中断所有信号的产生处理都是内核完成的,我们只是中间的一条线产生信号按键产生,CTRL + C,(终止进程) CTRL + z(暂停,后台运行,可用fg恢复), CTRL + \(终止进程)等系统调用产生, kill, raise, abort等软件条件产生, 定时器 alarm(sleep其实就是一个定时器

2021-12-06 13:15:55 1120

原创 Linux系统编程-进程三

进程案例(父子间)#include <iostream>#include <wait.h>#include <unistd.h>using namespace std;int main(int argc, char** argv){ int pipefd[2]; int pipe_ret = pipe(pipefd); if (pipe_ret == -1) { perror("int pipe_ret = pipe(pipefd);");

2021-12-01 20:02:42 692

原创 Linux系统编程-进程二

感觉需要说一下,概念性的东西,都只是个人理解.EXEC函数族头文件#include <unistd.h>execlp(加载一个进程,借助PATH)原型int execlp(const char *file, const char *arg, .../* (char *) NULL */);返回值成功无返回失败返回-1 函数后直接跟(无需判断,因为没有返回,如果成功后续代码不会执行)perror();exit(...

2021-11-30 17:20:45 1452

原创 Linux系统编程-进程

CPU存储是越靠近CPU速度越快,容量越小网络->硬盘->内存->缓存(缓存中还分等级)->寄存器(4byte(32位,1byte = 8 bit,32/8=4))CPU中有预取器(取指令)->译码器(就是个翻译官)->ALU(算数逻辑单元(只能做加法和左移))->最后到寄存器然后在缓存等等到磁盘MMU(大小是4K)将虚拟地址映射到物理地址上MMU会把内存分级,常规等级,还有系统等级(当然这个是我说的,不过分级是真的存在)内核内核(操作

2021-11-29 16:21:20 495

原创 Linux系统编程-文件IO二

递归创建目录

2021-11-29 06:44:08 573

原创 Linux系统编程-文件IO

man 共有九卷,系统编程也就是第二卷的内容,第五卷是文件格式和规范open函数函数原型参数pathname文件名参数flags为访问方式的宏:O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写)这三个是必须加的O_APPEND(追加),O_CREAT(创建),O_EXCL(是否存在),O_TRUNC(截断,普通文件写操作截断为0),O_NONBLOCK(非阻塞,设置之后后面任何IO操作都不会阻塞)参数mode_t mode是一个八进制数,0777返.

2021-11-26 04:09:03 705

原创 linux系统编程最后的准备工作-makefile,gdb调试

vi基本使用之前介绍过就不再叙说了,makefile和GDB这里详细的说一下.当然了,用什么文本编辑,用什么调试最终的目的都是一样的.但是那只是限定于有选择的时候,而开发人员不是消费者,没有选择的时候vi和GDB还是要用的.其实熟练之后命令一定比自然交互要快(无论是鼠标点击,触屏,还是语音),最简单的例子在windows中打开计算器,一定是win + r 然后calc回车更快.makefilemakefile其实也就是一个脚本嘛文件名makefile固定的,全部小写或首字母大写代

2021-11-23 23:46:59 400

原创 linux系统编程-静态库和动态库(共享库)

静态库N个程序,需要使用同一个静态库,会加载这个库N次.(可以看成宏函数)动态库(共享库)N个程序,需要使用同一个共享库,这个库只有一份可以在连接时加载到各个程序.(其实可以看成函数调用)计算机嘛,无非时间换空间,空间换时间.时间要求高就静态库,空间要求高就共享库.没有特定要求时函数宏函数,当然选函数了.也就是动态库.制作静态库命令ar rcs libxxx.a xxx.olibxxxlib.a 约定的东西,敲代码嘛,别搞.GCC常用命令GCC编译过程:预处理,

2021-11-22 20:07:51 1473

原创 python基础语法

import random # 倒入随机数头文件"""python 代码结束没有;代码开始不能有空格注释# 使用在语句后需要两个空格在写 # 之后一个空格 在写内容多行注释 """"""转义字符和C相同 \n换行 \t制表 等等(靠突然想起来数据库的时候转义符斜线写反了)"""print("hello world") # 输出print("hello world", end="") # print函数会自动换行end=可以增加后续输出,空串表示不换行print(2 ** 4) .

2021-11-21 16:58:15 700

原创 Linux后端开发-shell编程

命令行参数算数运算符算数运算符和C中都一样,但是shell本身并没有这个功能,需要使用expr(他的功能是计算(+-等),关系(><等))其他的算数运算符和C中的一样,取模等也都有.

2021-11-21 16:32:26 198

原创 Linux后端开发-POSIX标准以及shell编程

POSIX标准就是定义了类Unix系统提供接口(系统API(应用程序和库之间的编程接口),shell命令)的标准,便于代码的移植.除了API还有ABI应用程序二进制接口他是让一个可执行的文件可以在支持ABI标准的平台上运行主流Unix都支持POSIX标准,但是不仅仅局限于Unix,简单的说市面上绝大部分系统为了兼容性都会支持.(这些不准确啊,只是个人理解,有兴趣了解详情还是查查比较好)当然了,标准嘛一定会跟随时代的改变而改变,例如C/C++也会更新,新的标准.Linux常见系统调

2021-11-20 21:40:51 2109

原创 linux文件系统

前面简单的说过linux之后一段时间就和linux玩耍了,也就是linux后端开发.文件系统就是对数据和程序的存储与访问的子系统文件系统文件和目录文件类型文本文件:编码组成(ascll码)二进制可执行文件其他文件会有特定的程序去解析硬盘格式化低级格式化划分磁道和扇区(每个磁道上的扇区数是相等的)高级格式化构建文件系统(是一组数据结构) 分区表:划分磁盘(磁盘分区) 目录fdisk -l//查看系统磁盘数据扇...

2021-11-18 22:29:38 3864 5

原创 QT中的网络编程(网络聊天)

这里主要说的是TCP通信服务器简略设计客户端和客户端之间是不能直接交互的,这也是服务器存在的意义.响应和接收信息时都是异步通信的方式,产生相应信号创建服务器连接使用QTcpServer(QT中创建TCP服务器的类)创建服务器设置监听服务器ip地址和端口响应客户端连接获取客户端通信的TCP套接字保存客户端通信套接字实时接收客户端发送的消息接收客户端发送的信息检查客户端是否有消息有消息则读取 保存 显示将消息发给所有在线的客户端客户端简略设计创建通

2021-11-16 22:51:35 1330

原创 Qt中使用sqlite

Qt中使用数据库的类有三个QSqlDatabase建立Qt应用程序和数据库连接//添加数据库驱动QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//设置数据库名字db.setDatabaseName("xxx.db");//打开数据库bool flag = db.open();需要在工程文件中添加QT += sqlQSqlQuery执行数据库操作的SQL语句QSqlQuery query;query.

2021-11-15 16:27:53 1127

原创 Qt数据库模块-sqlite简介

轻量级数据库,Qt对不同数据库的操作是一样的,换成其他数据库方式流程都是类似的.数据库就是有一定方式存储在一起,不同数据库的存储方法可能不同.可以多用户共享,例如各种网盘.最终存储就是在固定的硬盘上.甲乙两人网盘上的文件内容相同,会只保留一份,共享另一份.其实这样说不够精确,数据库实际上会尽可能不存放相同的文件.数据库和程序是彼此独立的,可以确保数据安全性.术语DB 数据库(database)DBMS 数据库管理系统(数据是每个公司的核心,每一步都需要反复确认)DBA

2021-11-14 11:53:03 1515

原创 Qt事件-键盘事件

QWidget类定义了键盘事件,按下键盘或文本等都可以触发事件.void keyPressEvent(QKeyEvent* event);//键盘按下void keyReleaseEvent(QKeyEvent* event);//键盘释放案例按键盘移动控件keymove.h#ifndef KEYMOVE_H#define KEYMOVE_H#include <QDialog>#include <QKeyEvent>#include &.

2021-11-11 17:00:20 603

原创 Qt事件处理-鼠标事件

键盘事件定义于qwidget类,描述鼠标事件.void mousePressEvent(QMouseEvent* event);//鼠标按下void mouseReleaseEvent(QMouseEvent* event);//鼠标抬起void mouseDoubleClickEvent(QMouseEvent* event);//鼠标释放(抬起)void mouseMoveEvent(QMouseEvent* event);//鼠标移动案例控件拖拽改变背景颜色等在样式表中s.

2021-11-11 15:19:21 1653 3

原创 Qt事件处理-定时器事件

在一些周期性的操作,也就是每隔一段时间就执行的操作使用定时器事件.时间到了就会执行.Qt有两种方法提供定时功能定时器事件,由object提供定时器信号,由qtime提供定时器事件//启动定时器事件,每个num毫秒触发一次,返回定时器标识IDint QObject::startTimer(int num);//定时器事件处理函数,事件处理函数都是虚函数void QObject::timerEvent(*QTimerEvent);//关闭标识为ID的定时器void QObje

2021-11-09 13:25:35 905

原创 Qt事件处理机制-绘图事件

QT事件其实就是操作响应的事,例如按鼠标,键盘等等响应的事。Qt中所有事件对象类型都继承自抽象类QEvent。事件发生时先调用QObject类中的虚函数event(),参数(QEvent)指定事件类型。事件函数都是需函数,可以根据需求重写。绘图事件...

2021-11-09 00:27:53 626

原创 Qt-信号和槽

什么是信号和槽实现对象之间数据交互,QT中自定义的通信机制.一个对象发送信号,另一个对象槽接受并执行操作槽和普通成员函数相同,可以公有,私有,保护,重载等等.槽函数体现在对特定信号的处理,可以和对象信号建立连接,一个对象发送信号,槽函数将被触发执行.信号声明class XXX:public QObject{ Q_OBJECT //MOC编辑器中的宏,QT自己的编译器signals: void signalFunc(); //信号只需要定义,不需要实现

2021-11-07 20:20:19 305

原创 QT父窗口

QT一个窗体就是一个控件,如小程序我们再加入一个label他将会是两个窗体.这样显然不适合管理,所以需要父窗口.父窗口的意义就是统一管理各个控件,使控件停靠在父窗口上,并且可以一起移动关闭等等.一般父窗口有三个QWidget 他是一个老大(不知道选什么的时候选择)QMainWindow 主窗口,继承于QWidget(功能很多时选择)QDialog 对话框,继承于QWidget(功能较少时选择)这个东西的选择没有标准的规定.设置窗口位置...

2021-11-05 16:30:55 2177

原创 linux第一个QT程序,QT简介以及QT中文乱码问题

建立cpp文件,写入如下代码执行qmake -project,生成.pro文件,打开文件,添加 QT += widgets执行qmake,生成makefile文件执行make命令当然可以直接在qtcreate上写.QT简介其实就是为了和用户更好的沟通嘛.但是敲键盘的毕竟不是专业的UI所以我们只是实现功能.QT不需要看任何书视频,因为无论哪部视频哪本书,介绍的都不会全.出现问题去找还是找不到,QT提供了大量的示例以及完整的文档,需要什么查什么就好了.QT中文乱码问题通过QT

2021-11-05 10:40:36 141

原创 Linux下QT安装

数据结构之后,再说吧.其实应对一般情况也够了,树的部分最优二叉树(也就是哈夫曼树)需要着重了解一下.图的话因人而已了.先来个圆面积的小程序创建的时候注意项目名称不能为中文.套件选择自己有的,因为只是简单的小程序基类选择对话框就可以.双击 .ui文件在右侧上找类的名称直接脱到窗口具体调整之后再说,UI就不多说了我也只会敲键盘,UI实在不专业....

2021-11-05 07:52:55 199

原创 线索二叉树(数据结构就到这里吧)

所谓线索二叉树其实就是,二叉树中有很多空结点,左孩子结点为空指向前驱,右孩子结点为空指向后继.(前驱后继是只遍历时的前驱后继(前序,中序,后序)).具体实现就是借助标志,为了操作统一,增加头结点,头结点的左孩子指向根节点,右孩子指向最后一个结点.算了吧,数据结构就到这里吧,代码量太大,还要画图.实在太浪费时间精力了.而且这个东西的代码本身意义实在有限.所以就到这里吧,之后有时间的话再补上....

2021-11-03 16:20:50 122

原创 树和二叉树

树一个结点有多个后继多用树来表示有层次的结构,树的应用非常广泛0个结点为空树树的基本术语有序树:树的结点从左到右有序(最左的结点为第一个孩子)无序树:树中结点没有顺序森林:N(n >= 1)个互不相交的树的集合(树一定时森林,森林不一定是树)二叉树结构简单,规律性强任何树都可以转换为二叉树,因为多叉树很难实现运算.二叉树的结点不能大于2(度不能大于2)二叉树的结点有左右子分,并且不能颠倒(即使单独只有左右一个结点)....

2021-11-01 10:31:38 94

原创 串,数组和广义表

串只能是字符的线性表子串串中取任意字符包括串自身子串位置子串在串中第一个字符出现的位置空格串" "空格串""空串

2021-10-26 09:47:45 100

原创 数据结构-栈和队列

栈(LIFO-last in Frist out)仅在表尾(栈顶)进行插入删除操作的线性表.表尾又叫栈顶(top),表头又叫栈底(base)插入到栈顶叫入栈(push)删除栈顶元素叫出栈(pop)队列(FIFO-fist in Frist out)仅在表尾插入,在表头删除操作的线性表...

2021-10-25 09:29:45 3559

原创 数据结构-线性表

线性表具有相同数据的有限序列,首元素没有前驱,尾元素没有后继.其他元素只有一个前驱和后继.顺序存储逻辑上相邻的数据元素,存储在物理上相邻的存储单元中.优点存储密度大,可以随机存取表中任意元素缺点插入删除需要移动大量元素,浪费空间,不能自由扩充不够灵活.时空复杂度时间复杂度为O(n)空间复杂度为O(1)sequence_list.hpp#pragma once#include <iostream>using namespace std;

2021-10-20 12:50:22 160

原创 数据结构,抽象数据类型,算法时间复杂度分析

也叫向量,用定长的一维数组存储.特性元素类型相同.按顺序存储空间中,每个元素都有唯一的索引值.使用常数作为向量的长度.方便读写,通过下标可以随机存取.

2021-10-15 14:57:18 151

原创 线性表-顺序表

真不知道数据结构怎么样才能是效率,除了敲代码好像也做不了啥.那就干脆就是保留代码吧.头文件#pragma once#include <iostream>using namespace std;const int MAX = 100;template<class T>class SequenceList{public: SequenceList(); bool isEmpty(); void clearList(); //返回pos位置的元素

2021-10-13 23:50:01 47

原创 数据结构-线性表

线性表是最简单基础也是最常用的线性结构.元素之间存在一对一的线性关系,在线性表中元素类型是相同的.线性表运算//初始化线性表void initiate();//返回线性表中元素个数int length();//返回线性表索引为num的值(0 <= index < length)dataType getValue(int index); //dataType是元素类型//查找数据元素,找到返回数据元素的索引值,没有找到返回-1int getIndex(da

2021-10-12 23:14:45 111

原创 ADT和算法

数据结构实在给我难住了,把队列栈啥的都用代码实现一遍实在没有啥意义啊.其他描述也真心太无力了.都想直接跨过上QT算了,然后找到本书大概看了下还算可以,就按照书来把.抽象数据类型(ADT)他是一个数学模型,例如整型(int)的ADT就是加减乘除取模,无论在何种机器下,他的数学特性相同.而抽象意义就在于将数据类型抽象为数学特性,使用户不必关心内在实现方法.例如堆栈等的增删查改,就可以使用ATD抽象出去,无论什么形式实现,提供的接口可以是一样的.算法定义的描述算法可以使用自然语言描

2021-10-12 16:31:30 355

空空如也

空空如也

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

TA关注的人

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