自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程的临界区

临界区解决线程冲突问题,多个线程操作同一个变量,会引发这样对待问题。

2022-09-15 15:58:06 265

原创 让一个对象只在栈(堆)上分配内存

在c++中,类的对象建立分为两种,一种是静态建立,比如A a;另一种是动态建立,比如是由编译器为对象在栈空间中分配内存,通过移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。这种方式是。是用new关键字将对象建立在堆空间上,这个过程分两步走。首先是执行,在堆空间上搜索合适的内存并分配;第二步是调用构造函数构造对象,初始化这片内存空间。这种方式是。Heap(堆):堆的大小并不固定,可动态调整。其分配由malloc()、new()等这类实时内存分配函数来实现。

2022-05-09 17:55:48 274

原创 send()和recv()函数详解

send()函数int send( SOCKET s, const char FAR *buf, int len, int flags );不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的参数:第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socke

2021-12-11 01:05:52 1545

原创 013_C基础预处理

013_C基础预处理1.1预处理1.2 文件包含处理1.3宏定义1.4条件编译1.5一些特殊的预定宏动态库1.1预处理1)预处理的基本概念C语言对源程序处理的四个步骤:预处理、编译、汇编、链接。预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析,但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。2)预编译命令C编译器提供的预处理功能主要有以下四种:1)文件包含 #include2)宏定义

2021-09-28 12:17:43 239

原创 012_C基础链表和函数指针

012_C基础链表和函数指针1.1链表1.2 链表的相关概念1.3 分类1.4 基本操作1.5 指针函数和函数指针1.1链表链表是一种常用的数据结构,它通过指针将一些列数据结点,连接成一个数据链。相对于数组,链表具有更好的动态性(非顺序存储)数据域用来存储数据,指针域用于建立与下一个结点的联系。建立链表时无需预先知道数据总量的,可以随机的分配空间,可以高效的在链表中的任意位置实时插入或删除数据。链表的开销,主要是访问顺序性和组织链的空间损失。1.2 链表的相关概念1)有关结构体的自身引用#

2021-09-28 11:58:49 253

原创 死锁、预防死锁、避免死锁

1.什么是死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。2.产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。3.产生死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3)

2021-09-09 18:33:44 798

原创 找出两个字符串中最大子字符串,如“abractyeyt“,“dgdsaeactyey“的最大子串为“actyey“

找出两个字符串中最大子字符串,如"abractyeyt",“dgdsaeactyey"的最大子串为"actyey”#include <iostream>#include <string>using namespace std; string MaxSameStr(string str1,string str2){ string result; int max=0,first; int len=0;//相同字符串的长度 int k,q;

2021-08-29 15:50:46 142

原创 前缀、中缀、后缀表达式转换

1、中缀表达式转后缀表达式的两种方法:假定有中缀表达式A:1 + (( 2 + 3)* 4 ) – 5,请将它转化为后缀表达式。方法一:直接转换法(1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 )(2)从最里面的一层括号开始运算,转换成后缀表达式的方法为:(忽略括号)数字在前,符号在后。 1)( 2 + 3) => 23+ 2) (( 2 + 3)* 4 ) => 23+4*

2021-08-29 15:28:24 571

原创 C++中的boolalpha

1.头文件#include <iostream>2.功能boolalpha: 把bool值显示为true或falsenoboolalpha: 取消 boolalpha流的格式标志3.例子void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::

2021-08-24 22:17:19 635

原创 写中断程序要注意哪些方面?

与每类I/O设备相关的进程都有一个靠近内存底部的地址,称作中断向量。它包括中断服务程序的入口地址。当中央处理器正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。一个中断分为哪几个部分:中断请求、中断响应、中断处理、中断返回中断处理过程:(1)保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值。(2)分析中断原因

2021-08-20 17:12:43 7195

原创 Qt基础的相关操作

Qt是一个跨平台的C++应用程序开发框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发图形用户界面程序,也可用于开发非图形用户界面(比如命令行界面)程序。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等1、Qt工程路径不能有中文。2、给Qt控件设置内容,如果有中文,必须是utf-8编码3、从Qt得到的字符串,如果有中文,编码是utf-84

2021-07-11 15:34:14 333

原创 011_C基础文件操作_练习

011_C基础文件操作_练习1.强化训练:实现vi、cat命令2.强化训练:文件版四则运算3.强化训练:文件版排序4.强化训练:大文件拷贝1.强化训练:实现vi、cat命令实现cat命令#include <stdio.h>int main(int argc,char *argv[]){ //打开文件,文件路径,argv[1],读方式 FILE *fp = fopen(argv[1],"r"); //读取文件内容,将内容显示到屏幕 char ch; while (1) {

2021-04-12 00:49:32 178

原创 08_C基础内存管理

08_C基础内存管理1. 作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结2. 内存布局2.1 内存分区2.2 存储类型总结1. 作用域C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域1.1 局部变量局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点

2021-03-16 00:20:20 292

原创 06_C基础函数定义说明和多文件编程

06_C基础函数定义说明和多文件编程1. 概述1.1 函数分类1.2 函数的作用2. 函数的定义2.1 函数定义格式2.2 函数名字、形参、函数体、返回值3. 函数的调用3.1函数执行流程3.2 函数的形参和实参3.3 无参函数调用3.4有参函数调用3.5 函数返回值4. 函数的声明5. main函数与exit函数6. 多文件(分文件)编程6.1 分文件编程6.2 防止头文件重复包含1. 概述1.1 函数分类C 程序是由函数组成的,我们写的代码都是由主函数 main()开始执行的。函数是 C 程序

2021-03-11 23:08:12 473

原创 04_C基础数组与字符串

04_C基础数组和字符串1. 概述2.一维数组2.1 一维数组的定义和使用2.2 一维数组的初始化2.3 数组名2.4 一维数组的最值2.5 一维数组的逆置2.5 冒泡法排序3.二维数组3.1 二维数组的定义和使用3.2 二维数组的初始化3.3 数组名4.多维数组5. 字符数组与字符串5.1 字符数组与字符串区别5.2 字符串的初始化5.3 字符串的输入输出5.4 字符串追加1. 概述在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组数组就是在内存中连续的相同类型的变

2021-03-09 23:50:47 497

原创 03_C基础程序流程结构

03_C基础程序流程结构1. 概述2. 选择结构2.1 if语句2.2 if…else语句2.3 if…else if…else语句2.4 三目运算符( ? : )2.5 switch语句3. 循环结构3.1 while语句3.2 do…while语句3.3 for语句3.4. 嵌套循环4. 跳转语句break、continue、goto4.1 break语句4.2 continue语句4.3 goto语句(无条件跳转,尽量少用)1. 概述C语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结

2021-03-09 22:36:41 430

原创 02_C基础数据类型

02_C基础数据类型1.1 常量与变量1.2进制1.3码型1.1 常量与变量1.1.1关键字C的关键字共32个 数据类型关键字12个:char,short,int,long,float,double,unsigned,signed,union,enum,void控制语句关键字12个:if,else,switch,case,default,for,do,while,break,continue,goto,return存储类关键字5个:auto,extern,register,static,c

2021-03-05 00:59:03 645

原创 01_C基础编译知识

01C基础编译知识1、gcc编译器介绍2、代码分析3、C程序编译步骤1、gcc编译器介绍gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,gcc同样适用于微软的Windows。gcc最初用于编译C语言,随着项目的发展gcc已经成为了能够编译C、C++、Java、Ada、fortran、Object C、O

2021-01-18 00:46:17 243

原创 LeetCode143-重排链表

方法一:class Solution {public: void reorderList(ListNode* head) { map<int, ListNode*> m; int num = 0; while (head) { m[num] = head; num++; head = head->next; } num--; if (num < 2) return; int i = 0; while (i < num) .

2020-09-14 00:25:05 102

原创 二叉树遍历(递归与非递归)

二叉树二叉树基本概念二叉树的遍历二叉树递归遍历求叶子结点数目求树的深度拷贝,释放二叉树二叉树非递归遍历二叉树基本概念定义:n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成基本特点:每个结点最多只有两棵子树(不存在度大于2的结点);左子树和右子树次序不能颠倒(有序树)。二叉树性质:性质1: 在二叉树的第i层上至多有2i-1个结点(i>0)性质2: 深度为k的二叉树至多有2k-1个结点(k>0)性质3: 对于任何一棵二叉树,若度为2

2020-08-05 15:03:18 484

原创 栈的应用_就近匹配_中缀后缀表达式

栈的应用栈的应用_就近匹配中缀表达式和后缀表达式中缀表达式转后缀表达式根据后缀表达式求解栈的应用_就近匹配检测括号是否匹配的能力算法思路 从第一个字符开始扫描 当遇见普通字符时忽略, 当遇见左符号时压入栈中 当遇见右符号时从栈中弹出栈顶符号,并进行匹配 匹配成功:继续读入下一个字符 匹配失败:立即停止,并报错 结束: 成功: 所有字符扫描完毕,且栈为空 失败:匹配失败或所有字符扫描完毕但栈非空//LinkStack.h#ifndef LINKSTACK_H#d

2020-08-05 15:01:47 168

原创 数据结构受限线性表

受限线性表栈的基本概念栈的顺序存储栈的链式存储队列基本概念队列的顺序存储队列的链式存储栈的基本概念概念:首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。特性:它的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。先进后出栈的插入操作,叫做进栈,也成压栈。栈的删除操作,叫做出栈,也有的叫做弾栈,退栈栈的顺序

2020-08-05 15:01:24 505

原创 数据结构线性表

线性表线性表基本概念线性表的顺序存储线性表的链式存储线性表基本概念线性表是零个或者多个数据元素的有限序列。特性:数据元素之间是有顺序的.数据元素个数是有限的.数据元素的类型必须相同.性质:a0为线性表的第一个元素,只有一个后继。an为线性表的最后一个元素,只有一个前驱。除a0 和an外的其它元素ai,既有前驱,又有后继。线性表能够逐项访问和顺序存取。线性表的顺序存储线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。优点:无需为线性表中的逻辑关系增加额

2020-08-05 15:01:03 350

原创 strcpy,memcpy区别与实现

strcpy和memcpy都是标准C库函数,它们有下面的特点strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc);不调用库函数,实现strcpy函数;字符串复制实现//源字符串加const防止被修改char * s

2020-08-05 15:00:28 279 1

原创 C/C++ 内存5大分区

C/C++中内存分5大区:栈,堆,全局/静态存储区,常量存储区,代码区栈(stack):指那些由编译器在需要的时候分配,不需要时⾃动清除的变量所在的存储区,效率高,分配的内存空间有限,形参和局部变量分配在栈区,栈是向地地址生长的数据结构,是一块连续的内存堆(heap):由程序员控制内存的分配和释放的存储区,是向高地址生长的数据结构,是不连续的存储空间,堆的分配(malloc)和释放(free)有程序员控制,容易造成二次删除和内存泄漏静态存储区(static):存放全局变量和静态变量的存储区,初始化的变

2020-08-05 14:59:00 452

原创 算法时间复杂度_大O表示法

大O表示法算法的时间复杂度 都是指最坏时间复杂度常见的时间复杂度常见的时间复杂度之间的关系常用的时间复杂度所耗费的时间从小到大依次是:O(5) = O(1)O(2n + 1) = O(n)O(6n²+ n + 1) = O(n²)O(3n³+1) = O(n³)总结:1.只关注最高次项2.时间复杂度是指最坏时间复杂度3.只有常数项记做1算法的空间复杂度算法的空间复杂度并不是计算所有算法所占的空间,而是使用的辅助空间的大小。...

2020-08-05 14:58:19 322

原创 C++智能指针

智能指针的作用C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高 了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易 造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。头文件:#include < memory>C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,

2020-07-28 17:43:39 211 1

原创 常见的内存错误及其对策

发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。 常见的内存错误及其对策如下:1. * 内存分配未成功,却使用了它。编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)

2020-07-24 10:23:52 120

原创 C++对象动态建立和释放new和delete

在C语言中是利用库函数malloc和free来分配和撤 销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代 malloc和free函数虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用 malloc和free函数,而用new和delete运算符。 int *p = new int;delete p;int *array_p = new int[10];delete[] array_p;malloc不会调用类的构造函数,而new会调用类

2020-07-20 00:37:56 312

原创 C++异常

异常是一种程序控制机制,与函数机制独立和互补 函数 是一种以 栈结构 展开的上下函数衔接的程序控制系统,异常 是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中 跳跃回馈1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这 样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调 用者可以再适当的位置设计对不同类型异常的处理。 2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机 制,因为栈结构的本质

2020-07-19 02:01:05 85

原创 C++类型转换

c风格的强制类型转换,不管什么是什么类型,统统都是Type b = (Type)a;c++风格的类型转换提供了4种类型转换操作符来应对不同场合的的应用static_cast<> 父子 继承关系的指针或引用dynamic_cast<> 只能转换有继承关系的指针或引用,只能由子类转父类(基类)const_cast<> 增加或去除 对象的constreinterpret_cast<> 强行转换类型,用于没有任何关联之间的转换//1 static_c

2020-07-19 00:39:40 108

原创 函数模板与类模板

泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。泛型编程的代表作品  STL 是一种高效、泛型、可交互操作的软件组件。 泛型编程初诞生于C++中,目的是为了实现C++的STL(标准模板库)。 其语言支持机制就是模板(Templates)模板的精神其实很简单:参数化类型。 换句话说,  把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来 做成模板参数 T所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不 具体指定,用一个虚拟的类型来代表

2020-07-18 23:55:21 142

原创 纯虚函数 抽象类

基本概念纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何 派生类都定义自己的版本  纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分) =0,不是赋值,是语法一个具有纯虚函数的基类称为抽象类。 面向抽象层编程,意义何在?依赖倒转原则,可以解决main函数与实际类型的耦合度减少,维护度高,不用关心其他接口函数,拓展性强在构造函数中,只能初始化一些固定的变量,需要额外初始化的一些变量,不要放在构造函数中,在抽象类中,提供一个显示的初始化函数抽象

2020-07-18 01:51:44 150

原创 多继承 虚继承

多继承一个类有多个直接基类的继承关系称为多继承虚函数如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则 在对该基类中声明的名字进行访问时,可能产生二义性 多继承中二义性问题虚继承virtual¬ 如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性¬ 如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象¬要使这个公共基类在派生类中只产生一个

2020-07-18 01:43:36 104

原创 C++多态基础知识

多态C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象 对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻 系统 升级,维护,调试的工作量和复杂度.C++中通过virtual关键字对多态进行支持使用virtual声明的函数被重写后即可展现多态特性 多态成立的条件多态是设计模式的基础,多态是框架的基础静态联编和动态联编1、联编是指一个程序模块、代码之间互相关联的过程。 2、静态联编(static b

2020-07-18 01:41:51 197

原创 C++友元函数友元对象

友元采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成 员,成员函  数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需 要定义一些函数,这 些函数不是类的一部分,但又需要频繁地访问类的数据成员, 这时可以将这些函数定义为该  函数的友元函数。除了友元函数外,还有友元类, 两者统称为友元友元的作用是提高了程序的运行效率(即减少了类型检查和 安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。友元可以是一个函数,该函数被称

2020-07-18 01:09:44 350

原创 C++静态成员变量和成员函数

静态成员变量和成员函数类的静态成员,属于类,也属于对象,但终归属于类。 静态成员变量总结:静态成员函数静态成员占大小从上面可得出,求类的大小,static成员不包含在内C++类对象中的成员变量和成员函数是分开存储的成员变量:普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式静态成员变量:存储于全局数据区中成员函数:存储于代码段中。 this指针int getK( ) const //成员函数尾部出现const,修饰的

2020-07-18 01:09:06 63

原创 C++运算符重载提高

运算符重载提高赋值运算符重载 (operator=)数组下标运算符 (operator[])自定义数组类函数调用符号 (operator () )不可重载 && 和 || 操作符自定义字符串类赋值运算符重载 (operator=)用一个己有对象,给另外一个己有对象赋值。两个对象均己创建结束后,发 生的赋值行为。#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class

2020-07-18 01:06:42 214

原创 C++运算符重载

运算符重载友元重载 成员重载重载规则双目运算符重载单目运算符重载输入输出运算符重载友元还是成员所谓重载,就是重新赋予新的含义运算符重载的本质是函数重载。  友元重载 成员重载重载规则(1)C++不允许用户自己定义新的运算符,只能对已有的  C++运算符进行重载。 (2)C++允许重载的运算符 不能重载的运算符只有 4 个:(3)重载不能改变运算符运算对象(即操作数)的个数。 (4)重载不能改变运算符的优先级别。  (5)重载不能改变运算符的结合性。 

2020-07-17 23:55:57 133

原创 C++对象的构造和析构

对象的构造和析构构造函数析构函数拷贝构造函数构造函数的分类使用拷贝构造函数的几种场合构造函数C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做 构造函数. 在对象被创建的时候,用来初始化对象的函数自动调用:一般情况下C++编译器会自动调用构造函数.手动调用:在一些情况下则需要手工调用构造函数. 析构函数C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做 析构函数.析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。析构函

2020-07-17 01:46:16 785

空空如也

空空如也

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

TA关注的人

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