- 博客(198)
- 收藏
- 关注
原创 【C/C++】printf和cout的区别
printf 函数是 C 语言标准库 中的输出函数,是 C 语言用于向标准输出设备输出数据的主要方式cout 是 C++ 标准库 中的输出流对象,是 C++ 面向对象编程思想下的输出方式类型安全printf 需要手动指定格式控制符来确定输出数据的类型例如格式控制符与实际传递给 printf 的参数类型不匹配,如果将一个浮点数作为参数传递给使用 %d格式控制符的 printf 调用,可能会出现错误的输出结果而cout 是类型安全的。它能够根据传递给它
2024-07-24 14:04:23
755
原创 【C++】Qt实现简易的计算器(附代码)
中缀表达式和后缀表达式后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。中缀表达式转换为后缀表达式创建一个空栈和一个空串,用于存放运算符和转换后的后缀表达式;从左到右遍历中缀表达式中的每个元素:如果当前元素是操作数,将其添加到输出串的末尾;2.如果当前元素是左括号“(”,将其压入栈中;3.如果当前元素是右括号“)”,则重复出栈操作直到栈顶元素是左括号,并将所有操作符加入输出串中;4.如果
2024-07-24 13:53:22
557
原创 【LeetCode刷题笔记】LeetCode.24.两两交换链表中的节点
给你一个链表,**两两交换**其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2024-07-10 21:12:10
438
1
原创 【LeetCode刷题笔记】LeetCode.11.盛最多水的容器
LeetCode.11.盛最多水的容器一、题目描述给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。
2024-07-09 21:47:50
459
原创 【Qt】信号和槽机制
信号和槽的优点1.实现了类之间的数据通信2.实现了对象之间的松散耦合,易于维护和扩展3.信号和槽机制容易扩展,实现自定义的通信机制信号和槽可以一对一 、一对多和多对一
2024-06-28 16:08:25
578
原创 【C++】final关键字 | 避免派生、重写
C++11 标准引入的新关键字:final一、避免继承使用 final修饰整个类,表示这个类不能被其他类继承例如:在单例模式中使用 final关键字防止类被继承,严格控制实例化,保证了类不被进一步扩展例如:在单例模式中使用 final关键字防止类被继承,严格控制实例化,保证了类不被进一步扩展
2024-06-26 16:20:16
397
原创 【C++STL】Vector扩容机制
Vector 扩容机制Vector 在存储元素时,会预先分配一定的存储空间。当不断向 Vector 中添加元素,导致已分配的空间不足时,就需要进行扩容 来增加存储空间,以满足新元素的添加需求为什么需要扩容机制通过扩容机制,Vector 能够灵活地适应元素数量的变化,提供稳定和可靠的数据存储扩容策略固定倍数扩容每次扩容为原来容量的两倍。假设初始容量为n,当空间不足时,将容量扩展为2n优点:简单高效缺点:可能会造成空间浪费渐进式扩容每次扩容增加一个固定的增量,比如每次增加n个元素的空间
2024-06-25 20:40:54
789
原创 【Linux】Socket阻塞和非阻塞、同步与异步
阻塞阻塞模式下,send函数返回时,只代表需要发送的数据已经被拷贝到内核的发送缓冲区中并且如果发送缓冲区有足够的空间,数据可能已经开始从发送缓冲区发送到网络上。但是并不代表数据已经成功地被接收方接收当发送缓冲区空间不够大的时候,等到发送缓冲区空间足够大再发送调用recv函数并且套接字没有数据可读时,recv函数会阻塞当前线程,直到有数据可读或者出现错误。如果 recv 函数返回,返回值代表内核的接收缓冲区中的数据已经被拷贝到用户空间。/* Windows下UDP阻塞socket*/
2024-06-24 20:18:37
916
原创 【Linux】I/O多路复用模型 select、poll、epoll
在监听 socket 时,需要分配多个线程/进程维护多个 socket 连接,I/O 多路复用技术就是用来使用一个进程来监听维护多个 socket 连接多路:I/O 状态:可读、可写复用:使用一个线程/进程监听处理 I/O 事件,复用多个 socket 请求一、select 模型select 原理:1.创建一个文件描述符集合 fd_set set 0 不监听 1 监听2.设置文件描述符的状态FD_ZERO(&set); 初始化监听集合,将位码初始化为 0FD_SET(int s
2024-06-20 17:59:24
1133
原创 【C++】Template模板
Template在 C++ 中 模板被用于编写通用、可复用的代码,通过使用模板,可以避免重复编写相似的代码,提高代码的复用性和可维护性。模板分为函数模板和类模板,模板是泛型编程的基础,可以代表多个类型函数模板用于定义通用的函数,可以接受不同的参数,模板 T 会自动推导类型add 函数中可以接受 int型与 float型参数
2024-06-15 22:07:03
398
2
原创 【MySQL】事务的特性和隔离级别
数据库事务代表了对数据库进行的一系列修改操作。这些操作要么全部执行,要么都不执行,事务保证了数据的完整性和一致性。一、事物的基本特性 ACID1.原子性(Atomicity)事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全不执行。事务是最小工作单元,不可再分2.一致性(Consistency)事务必须使数据库从一个一致性的状态变换到另一个一致性的状态数据库的完整性约束不能被破坏3.隔离性(Isolation)在事务完成之前,对于外部是不可见的。即一个事务不能看到其他
2024-06-14 19:18:30
711
1
原创 【MySQL】锁机制
锁对数据并发访问的一致性、有效性尤其重要,锁冲突影响数据库的性能。一、数据库锁分类按照锁属性分为:共享锁(Share Lock):又称为读锁、S 锁,多个事务对于同一数据可以共享一把锁,只可读不可改。支持并发读取排他锁(eXclusive Lock):又称为写锁、X 锁,一个事务获得了一个数据的排他锁,其他事务就不能获得锁,可读可改按照锁的粒度分为:行锁(InnDB):只锁定某一行或多行,不对其他行有影响。开销较大;可能会出现死锁;锁粒度小,并发度高表锁(InnDB、MyIsam):锁整
2024-06-13 15:49:44
559
原创 【C/C++】观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。一、观察者模式的实现1. 定义观察者接口:包含 update 更新方法,定义为虚函数2. 创建具体观察者:实现观察者接口,定义接收到通知时的更新动作3. 定义主题接口:添加、删除和通知观察者4. 创建具体主题:实现主题接口,实现观察者列表,更新数据时通知观察者当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新
2024-05-27 23:12:35
491
原创 【C/C++】Makefile文件的介绍与基本用法
Makefile 是被用于自动化构建过程的脚本文件,对一个项目具有高可用性和可重用性。Makefile 描述了如何从一个或多个源文件编译、链接和生成目标文件或可执行文件。可以通过使用 make 命令方便地编译和重新编译项目,而无需手动执行每个构建步骤。源代码的编译过程 在我们编写完代码之后的.c文件被称为源代码文件,此时是代码的预处理期。● 编译期:在我们按下调试键后,编译软件中的编译器会将我们的源代码进行编译,成为汇编语言,如果我们在书写代码中有语法等错误,在编译时编译器将不会通过,会报出以
2024-05-26 22:52:49
1113
原创 【C/C++】设计模式——工厂模式:简单工厂、工厂方法、抽象工厂
工厂模式提供了一种封装对象创建过程的方式,使得代码更易于管理和扩展。工厂模式隐藏了对象的具体创建过程,从而可以通过接口来创建对象,而无需关心具体的实现细节。扩展性高:工厂模式利于后期方法的维护,解耦合。简单工厂模式(静态工厂)将对象的创建和使用分离,由一个工厂类根据传入的参数来决定创建哪一种产品类的实例,简单工厂违背了开闭原则,故将简单工厂中的工厂拆分为多个工厂:增加产品时 Factory 工厂不用改变,只需要添加对应产品类型的工厂
2024-05-11 14:22:00
951
原创 【C++11新特性】lambda表达式和应用场景
C++11 中的 lambda表达式用于定义匿名函数,同样有参数列表,返回值、类型和函数体,但是它可以在函数内部定义。定义小型匿名函数对象时更加便捷。lambda表达式的格式:auto 函数名 = [capture](parameters) -> return_type { body };其中:captures 捕获列表,用于捕获lambda外部的变量 , lambda可以把上下文变量以**值=或引用&**的方式捕获(如果是引用传递,lambda 函数将会改变变量值),在body中直接使
2024-05-09 22:53:52
415
原创 【C/C++】设计模式——单例模式
单例模式确保了一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式的特点:1.一个类只有一个实例2.提供一个全局访问点来获取这个实例3.单例对象必须由单例类进行创建(构造函数设为私有 private)如何实现单例模式?构造析构拷贝构造私有提供静态公有的获取对象的方法控制资源访问:通过单例模式,可以确保对某个资源的全局访问点只有一个,这样可以防止其他对象对该资源的访问导致状态不一致或数据污染。减少系统开销:如果一个类的实例创建非常消耗资源(如读取配置文件、打开数据库连接等),
2024-05-04 19:43:42
818
原创 【Python】sudt-输出一个字符串的字符的16-10-8-2进制数 Python代码实现
sdut-输出一个字符串的字符的16-10-8-2进制数输入一行字符串,去掉非16进制字符,将它转换成16、10、8、2进制数,输出输入格式:输入一行字符串。输出格式:输出转换后的16、10、8、2进制数。数据之间有1个空格。(16进制字母小写)输入样例:_ahg1*B输出样例:a1b 2587 5033 101000011011
2024-04-14 14:55:10
316
1
原创 【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字
目描述给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。以数组形式返回答案
2024-04-11 22:01:26
968
原创 【C/C++】C++中的四种强制类型转换
C++四种类型转换static_cast(待转换量)dynamic_cast(待转换量 )const_cast(待转换量 )reinterpret_cast( 待转换量 )为什么要提出新的类型转换?C语言中的强制类型转换无所不能,而C++强调类型安全。static_cast静态转换编译时确定的,用于相关内容的转换 。int short char 之间浮点数与整数普通指针和泛型指针
2024-03-27 19:16:37
1049
4
原创 【MySQL】一条 SQL 查询语句在数据库中的执行流程 | SQL语句中各个关键字的执行顺序
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
2024-03-25 18:33:57
564
1
原创 【C/C++】右值引用 | 完美转发 | std::move移动语义
引用可以分为左值引用,右值引用,常引用左值:可以出现在赋值号左和右的值可以取地址、修改、起名例如:变量、指针、对象右值:只能出现在赋值号右面不可取地址、修改、起名例如:常量、函数返回值、表达式返回值常引用可以接受左值也可以接受右值,但是不可以修改引用的值左值引用:给变量起别名,使用 &定义,定义了引用就要初始化,不存在空的引用!左值引用知识点:引用的概念和用法右值引用:用 && 符号引用右值左值引用和右值引用定义举例:
2024-03-01 11:13:57
719
5
原创 【C/C++】inline内联函数详解
内联函数在C++中是一种特殊的函数,内联函数的代码在编译时会在调用的位置展开,而不是在运行时调用函数。这样做可以消除函数调用的开销,从而提高程序的执行效率。相当于define宏替换内联函数可以分为:隐式内联函数:类内的函数(虚函数除外)都为隐式内联函数显式内联函数:在类外使用inline关键字修饰的函数
2024-02-28 23:40:37
768
4
原创 【Linux操作系统】死锁 | 预防、避免死锁
当多个进程竞争资源而处于阻塞状态,相互等待。如果没有外力推进,进程无法继续执行任务,这种情况称为死锁(Deadlock)。例如,进程A锁定了资源1并试图锁定资源2,而进程B已经锁定了资源2并试图锁定资源1。如果这两个进程都不放弃它们已经锁定的资源,那么它们都将永远无法获取到它们需要的资源,从而导致死锁。或者说每个进程所等待的事件是该组中其它进程释放所占有的资源。
2024-02-26 22:55:39
1047
3
原创 【C++STL】迭代器分类 失效问题
正向迭代器iterator容器.begin()容器.end()正向遍历容器内元素常正向迭代器容器.cbegin()容器.cend()正向遍历容器内的常量元素反向迭代器容器.rbegin()容器.rend()反向遍历容器内元素常反向迭代器容器.crbegin()容器.crend()反向遍历容器内的常量元素int main()//正向迭代器while (it!it++;//常正向迭代器while (cit!cit++;//反向迭代器。
2024-02-25 18:29:54
690
2
原创 【C++STL】STL容器详解
容器底层实现描述包含头文件向量vector数组,快速访问可以在O(1) 时间内访问和修改任意元素,在序列尾部进行插入和删除时,具有 O(1)时间复杂度,对任意项的插入和删除就有的时间复杂度较高,尤其对向量头的添加和删除开销非常高双端队列deque一个中央控制器和多个缓冲区基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作时间复杂度也为 O(1)表list双向链表,快速增删对任意元素的访问时间复杂度为 O(n),支持快速插入删除 O(1)
2024-02-24 17:11:42
794
3
原创 【LeetCode刷题笔记】242.有效的字母异位词
给定两个字符串 *s* 和 *t* ,编写一个函数来判断 *t* 是否是 *s* 的字母异位词。利用哈希表存储两个字符串中各自重复出现的字符次数,然后遍历比较两个字符串重复字符的哈希表,如果出现次数不同返回false注意: 若 *s* 和 *t* 中每个字符出现的次数都相同,则称 *s* 和 *t* 互为字母异位词。
2024-02-23 18:07:12
467
4
原创 【MySQL】数据库索引详解 | 聚簇索引 | 最左匹配原则 | 索引的优缺点
什么是索引?可以用于优化查询。mysql索引使用什么?有使用B+树的索引,有使用hash表的 引擎决定了索引的类型。为什么不使用 AVL、 红黑树作为索引?红黑树的本质仍是二叉树,当数据量比较大时,红黑树的层数比较高,每次读取节点都是在做磁盘 IO并且每个节点只能存储一个数据,但是在索引的数据结构中,一个节点需要存两个值,一个是key 用来存节点的值,一个是value 存索引所在行的磁盘地址,查到后就能获取到其value内的值即地址。为什么不使用哈希作为索引?哈希表不支持排序操作,哈希表不能进
2024-02-22 23:07:10
1567
3
原创 【MySQL】报错 Incorrect string value: ‘\xE5\xA4\xA9\xE5\x96\x9C‘ for column的解决方法
在向数据库中插入中文时遇到报错Incorrect string value: '\xE5\xA4\xA9\xE5\x96\x9C' for column ,此时为数据库的编码格式有问题,可以按照如下方法修改:输入以下sql语句将字符集和校验规则修改为utf-8:alter table 表名 modify 列名 列数据类型 character set utf8 collate utf8_general_ci;
2024-02-21 22:15:44
889
原创 【C++11新特性】详解智能指针 创建、使用、注意事项
C++11 中引入了智能指针,便于进行内存管理使用智能指针 需要包含头文件:#include 以及 std 命名空间智能指针会自动回收空间,不需要担心内存泄漏问题四种智能指针:auto_ptr(C++11 被弃用)unique_ptrshared_ptrweak_ptr一、 auto_ptr创建auto_ptr对象的三种方式:
2024-02-18 17:04:18
1588
原创 【Linux】线程Pthread的概念 | NPTL线程库函数
线程是操作系统能够进行调度和执行的最小单位。它是进程内执行的一个独立单元,与同一进程中的其他线程共享进程的地址空间和系统资源。线程能减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性。二、线程和进程一般情况下进程包含线程,线程比进程更轻量(体积更小,开销更小)进程是最小的分配资源单位,线程是最小的调度单位线程不分配内存,线程创建于进程中,与进程共享资源,访问进程的内存,完成特定任务类 Unix 系统中,早期是没有“线程”概念的,80 年代才引入,借助进程机制实现出了线程的
2024-02-06 22:18:30
859
原创 【Linux】Daemon守护进程详解
孤儿进程是父进程结束后,自己仍继续运行的进程。孤儿进程会被1号进程(init进程)收养。每当出现一个孤儿进程的时候,内核就把孤儿的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。二、守护进程守护进程是一种在后台持续运行的特殊进程。守护进程一般不与用户直接交互,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种特殊的孤儿进程。守护进程丢弃了原有的控制终端,因此需要创建新会话以脱离控制终端。会话是多个进程组的集合。如何建立新
2024-02-01 15:29:37
1157
原创 【Linux】mmap内存映射
mmap内存映射是一种可以用于进程间通信的技术,通过mmap,多个进程之间可以直接读取和修改磁盘上的文件内容,从而实现进程通信。同时也不需要像传统方式那样先将文件读入到用户空间,然后再从用户空间写入内核空间。这种映射机制提高了文件访问的效率。(相比于read()减少了一次拷贝开销)#include void* mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 函数参数:
2024-01-31 20:58:53
1059
原创 【Linux】匿名管道pipe和有名管道fifo详解
进程间通信IPC进程间通信是操作系统提供的一种机制,用于多个进程之间进行数据通信,实现资源协调与共享。IPC:Interprocess Communication 进程间通信例如在单任务处理器中,多个进程之间就依靠着进程间通信 调度CPU,使得多个进程高效率并发执行Linux中进程间通信的方式:管道:半双工通信方式,分为匿名管道(pipe)和有名管道(fifo),用于具有亲缘关系之间的进程通信消息队列:进程利用消息队列通过发送和接收消息进行通信信号:主要用于消息的通知和进程控制,不能传
2024-01-31 15:58:54
1294
原创 【Linux】wait()和waitpid()函数
在Linux或Unix系统中,子进程只能由父进程进行回收。如果进程结束但是进程资源仍未被回收,这个进程将会变为僵尸进程,会导致内存泄漏和系统性能下降。使用getchar() 阻塞父进程的执行,子进程结束后父进程未对其进行回收
2024-01-30 11:11:53
820
2
原创 【Linux】fork()函数
操作系统给用户提供了一系列的函数接口,让用户进行与进程有关的编程。一、fork()函数fork()函数用于创建一个子进程,调用fork()函数的是父进程该子进程与父进程几乎完全相同,父子进程的代码共享,但是他们的进程id(PID)不同。fork()函数拥有两个返回值:父进程的fork()函数返回子进程的pid子进程的fork()函数返回0父进程进行代码的全部,子进程执行从fork()函数后的代码,父子进程同时执行fork()函数的使用举例:
2024-01-29 18:30:02
968
原创 【Linux】进程概述
进程在不同角度下可以有不同的定义:进程是进程实体的运行过程。进程是系统进行资源分配和调度的一个单位,是一个任务执行的逻辑单元。在早期计算机的结构中,进程是一个程序及其数据在处理机上顺序执行时所发生的活动。在当代计算机结构中,进程与程序显然是截然不同的概念,程序与进程没有必然联系在进程执行时如果没有数据往来,程序文件被删除甚至都不会影响进程的运行。进程拥有程序所没有的特征:二、进程的特征1.动态性:进程的实质是进程实体的执行过程,它是有生命的,具有各种状态。2.并发性:指多个进程
2024-01-26 14:21:30
1071
原创 【算法】如何不用中间变量交换两个数据?
一、+ - -使用+ 和-完成交换: a = a + b; //a = a + b组合 b = a - b; //b = 组合 - b = 原始a a = a - b; //a = 组合值 - 原始a = b首先,通过加法将两个变量的值组合在一起,然后减去b来获得a的原始值,将原始的a值赋值给b最后再减去新b就能获取到b的原始值,将原始的b赋给a,此时a和b就完成了交换同理乘除等运算也可以注意数据相加可能溢出二、^使用异或^进行交换: a = a^b;
2024-01-15 20:41:38
430
原创 【LeetCode刷题笔记】344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须[原地]修改输入数组、使用 O(1) 的额外空间解决这一问题。二、示例示例 1:输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]三、题目分析使用双指针的思想,令一个指针指向字符串
2024-01-05 20:31:38
942
基于动态体系的机场综合管理系统
2023-11-01
操作系统重要概念复习总结
2023-11-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人