自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。但由于是对话框,它对一些消息有特殊的处理。

2023-06-16 17:04:56 2152

原创 【.cpp文件中打断点,断点失效解决方法】

断点失效解决方法

2022-07-15 12:19:38 668 1

原创 【C++简介】

参考《C++Primer》

2022-07-11 16:46:19 4623

转载 HTTP协议

Hyper Text Transfer Protocol(超文本传输协议)。是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。HTTP默认的端口号为80,HTTPS的端口号为443。如下图所示:HTTP是一个应用层协议,由请求和响应构成,是一个

2022-06-28 09:39:06 254

原创 【快排、UDP/TCP协议、TCP/IP分层模型及每层特点、死锁产生及避免方法】

快速排序属于交换排序的一种,是基于二叉树结构的交换排序的方法;基本思想:1)任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两个子序列;2)左子序列中所有元素均小于基准值,右子元素序列中所有元素均大于基准值,然后左右子序列重复该过程,直到所有排列都在相应的位置上;代码:oid quickSort(int *array, int left, int right){ if(left < right) { int pivot = array[left];.

2020-09-18 18:02:34 781

原创 【字符串筛选--小米】

题目描述:对输入的字符串,去掉重复的字符,只保留第一次出现的字符;解题思路:整两个容器,遍历第一个容器,并判断其元素是否在第二个容器里,在的话,不作为,不在的话添加进去即可;代码:#include<iostream>#include<string>#include<vector>using namespace std;void screen(vector<char>&old, vector<char>&n

2020-09-16 09:51:12 217

转载 【反转链表 c++实现】

【题目描述】输入链表的头结点,反转链表后输出链表的所有元素;struct ListNode { int val; struct ListNode *next;};【解题思路】1)定义三个辅助指针和一个用于表示翻转链表头结点的指针;2)node指向当前节点、left指向当前节点的前一个节点、right指向当前节点的下一个节点、ReverseHead指向翻转链表的头结点;【】题目来源:牛客网参考博客:https://www.cnblogs.com/wanglei5205/

2020-09-11 19:49:38 697

原创 【数据结构(栈和队列)】

一、栈1、什么是栈?栈是一种特殊的线性表 ,只允许在固定的一端进行元素的插入和删除操作,且称进行操作的那一段为栈顶,另一端称为栈底;2、栈的基本操作(1)压栈栈的插入操作,插入的数据在栈顶(2)出栈栈的删除操作,出栈的数据也是栈顶数据即先进先出;3、栈的实现栈一般利用数组或者链表实现,常用数组结构实现,因为尾插时的代价比小;stack.h// 顺序表的动态存储#ifndef _Stack_H_#define _Stack_H_#include <stdio.

2020-09-09 20:30:55 146

原创 【c++11特性小总结】

一、C++11相比于C++98/03的变化?相比于C++98/03,C++11包含了约140个新特性,能更好的用于系统开发和库开发,语法更加简单化、稳定、安全,且能提高程序员开发效率;二、列表初始化C++11允许使用{}对数组元素进行统一的列表初始值设定,但是对于自定义类型,没有办法使用这样的初始化;(1)内置类型列表初始化直接用{}对变量、数组、标准容器进行初始化;且在{}之前使用等号,其效果和不适用=没有区别;(2)自定义类型列表初始化- 支持单个对象的列表初始化(引用、cons

2020-09-09 17:51:07 416

原创 【数据结构(时间、空间复杂度;顺序表;链表【链表有环、环入口点、链表相交、有序链表合并】)】

一、时间复杂度和空间复杂度1、什么是算法效率?算法效率分为时间效率和空间效率,时间效率被称为时间复杂度而空间效率称为空间复杂度;时间复杂度是主要衡量一个算法的运行速度,而空间复杂度主要衡量的是算法所需要的额外空间;2、什么是时间复杂度?时间复杂度是主要衡量一个算法的运行速度,因不能每次都让算法上机测试计算时间复杂度,所以将算法中的基本操作的执行次数,作为算法的时间复杂度;如何计算时间复杂度?答:大概计算算法的执行次数,用大O的渐进表示法进行表示;确定大O阶方法:(1)用常数1取

2020-09-09 17:49:27 782

原创 【了解空间配置器、STL关联式容器总结】

一、空间配置器1、什么是空间配置器?空间配置器是为了各个容器高效管理空间(实行空间申请与回收)而设置的内存管理机制;2、为什么需要空间配置器?在模拟实现很多容器的时候发现很多空间都是通过new动态申请的,故:a)动态申请的空间需要用户自己进行释放容易造成内存泄漏;b)频繁申请小块内存容易造成内存碎片,影响程序运行效率;c)malloc和new申请的空间,每块存在额外空间浪费,且申请空间失败没有应对方法;d)未考虑线程安全问题;3、STL空间配置器的实现原理以128作为小块内存

2020-09-07 20:33:11 158

原创 【STL中set怎样可以在插入时自动从大到小排序?】

map和set都是按照从小到大的顺序进行排序的,且排序好后不能轻易更改,否则会破坏组织结构;如何让其在插入过程中可以自动的变成由大到小的排序方式呢?tips:set在进行插入的时候一般会按照**<来比较关键字,所以其插入好的状态一般是从小到大;但是对于自定义类型,就需要重载<来支持这一操作;1、使用set前指定比较方式为greater**void test(){ set<int,greater<int>>S2; S2.insert(10.

2020-09-07 20:32:23 3894

原创 【哈希结构、哈希应用、unorder系列关联式容器】

一、以哈希为底层结构的unordered系列关联式容器(因为以红黑树为底层结构的,在树中结点非常多的情况下,其查询效率也不是非常的理想,所以c++11中又提供了底层结构为哈希结构的查询效率较高的容器)1、unordered_map(1)特点:存储键值对键和值的映射类型可能不同通过key访问value的速度比map要快,但是迭代效率比较低实现了中括号[]的重载至少有向前的迭代器(2)unordermap和map的对比:map:优点:有序性,这是map结构最大的优点,其元素的有序性在

2020-09-06 18:00:50 290

原创 【红黑树】

一、什么是红黑树?红黑树是一种二叉搜索树,但是每个结点上都增加一个颜色,可以是红色或者黑色;通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(相对于二叉搜索树条件弱化了),因而接近平衡;二、红黑树的性质(1)每个结点不是红色就是黑色;(2)根节点是黑色的;(3)若一个结点是红的那么它的两个孩子结点都是黑色的;(4)每个结点,从该结点到其他所有后代叶节点的路上,所包含的黑色结点数目是相同的;(5)每个叶子节点都是黑的;三、红黑树的定义

2020-09-05 17:04:06 265

原创 【关联式容器、键值对、map、set、二叉搜索树、AVL树】

一、关联式容器1、什么是关联式容器?关联式容器也是用来存储数据的,与序列式容器(vector、list【底层是线性序列的数据结构】)不同的是,其存储的是<key,value>类型的键值对,数据检索时比序列式容器更加高效;2、什么时键值对?用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value代表与key对应的信息;STL一共实现了两种不同结构的管理式容器:树形结构和哈希结构;二、树形结构关联式容器以下四种容器的共同特点是

2020-08-27 20:42:41 448

原创 【c++类型转换(c语言强制类型转换、c++强制类型转换、)】

一、c语言强制类型转换1、小范围类型转大范围类型的隐式类型转换2、大范围类型转小范围类型的显式类型转换缺陷:转换可视性比较差;二、c++强制类型转换四种强制类型转换的操作符:1、static_cast用于非多态(静态)类型的转换,比如数字类型之间的转换,但不可用于两个毫无关系的类型相互转换;2、reinterpret_cast用于将一种类型转换为另一种类型,比如:将指针转化为一个值放在一个变量里;3、const_cast添加或者删除变量的const属性;4、dynamic_ca

2020-08-26 19:00:57 316

原创 【c++智能指针及RAII机制的理解】

一、为什么要有智能指针?因为在平时编程过程中,极大可能会出现两种情况;(1)malloc出来的空间,没有进行释放,存在内存泄漏;(2)如果在malloc和free之间抛异常,那么同样存在内存泄漏问题。该问题称为异常安全问题。二、智能指针原理及使用1、智能指针的实现是基于RAII(资源获取即初始化)。即对象在构造时获取资源,且在对象的声明周期内资源始终有效,最后在对象析构的时候释放资源。即将一份资源管理的责任交给了一个对象。2、使用RAII思想设计智能指针类...

2020-08-26 17:27:21 933

原创 【c++ 异常】

一、c语言处理异常方式1、终止程序(如assert断言)2、返回错误代码(errno中存放的错误代码被返回)二、c++异常1、c++异常的概念 当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或者间接调用者去处理这个错误。2、关于异常的一些关键字 (1)throw:通过throw关键字来抛出异常(2)catch:在想要处理问题的地方,通过异常关键字catch来捕获这个异常(可有多个catch)(3)try:try块中为防止可能抛出异常的代码,其后常常紧跟一个或多个catch

2020-08-26 09:36:12 152

原创 【c++多态(虚函数、抽象类、虚表、静/动态绑定)】

一、什么是多态?1、多态基本概念多态就是去完成某个行为,不同的对象会产生出不同的状态。例子:普通人去服装店买衣服是按标准价给钱的,而店内员工在该店买东西,是按照员工价付款的。2、多态的定义(1)在继承中构成多态的两个条件:-必须通过基类指针或引用调用虚函数-被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。class Ordinary{ public: virtue void BuyCloth() { cout<<"全价购买" }};cla

2020-08-25 16:33:03 198

原创 【动态内存管理、文件操作、程序环境和预处理】

一、动态内存管理1、为什么存在动态内存管理?因为常规的内存分配只能分配固定大小的空间,比如数组和变量的定义,只会分配固定大小的空间。而有时候需要的空间在运行时才能确定。2、常见动态内存函数(1)malloc和freemalloc: void* malloc(size_t size);成功返回指向开辟好空间的指针,否则返回NULL指针。(返回的指针需要进行强转为所需类型)free: void free(void* ptr);释放动态内存(2)callocvoid * calloc(si

2020-08-25 16:01:55 151

原创 【整型和浮点型在内存中的存储、大小端、指针传参、strlen和sizeof区别、结构体对齐】

一、数据存储整型和浮点型在内存中是如何存储的?(1)整形整形在内存中是以补码的形式存储的,因为以补码形式存储保证了0的唯一性、使加减运算可以统一处理(因为cpu只有加法器,补码形式存储可以将减法用加法代替,提高运算效率)(2)浮点型浮点型在内存中的存储遵循IEEE-754格式标准,由符号位、指数和有效数字三个部分组成。对于32位的浮点数最高位为符号位、接着8位指数位、剩下的是32位有效数字;而对于64位的浮点数,同样最高位是符号位,接着是11位指数位,最后是52位有效数字位。不过对于

2020-08-25 11:18:39 448

原创 【继承练习(实现不被继承的类等)】

1、实现一个不能被继承的类将构造函数私有化或者利用c++11新关键字fininal禁止继承class NonInherit{public://这样派生类没有办法调用基类的构造函数,因此无法继承static NonInherit GetInstance(){return NonInherit();}private:NonInherit()//构造函数私有{}};// C++11给出了新的关键字final禁止继承class NonInherit final{};2、继承和

2020-08-16 16:27:39 138

原创 【c++继承、菱形继承、基类派生类对象转换、虚继承等】

一、继承的概念和定义1、继承的概念继承是实现代码可复用性的重要方法,在保留原类的特征基础上做一些扩展,形成新的类,叫做派生类。一个例子:父亲有一套房子,儿子长大了,父子两人共同拥有这套房。但是经过儿子的奋斗,自己又买了一套房,此时儿子可以说是拥有两套房,一套与父亲共享,一套完全属于自己。就像派生类一样,既有父类的东西,又有自己的东西。2、继承的定义(1)定义格式class Student : public Person{ public: int _stuid;

2020-08-16 14:08:17 307

原创 【c++的IO流、文件流对象】

1、c语言的输入输出c语言常用scanf():从标准输入读取数据,并将其存放至变量、printf():将指定文字/字符串输出到标准输出设备,设定输出宽度和精度;输入输出缓冲区:(1)屏蔽低级IO实现(2)可实现行读取2、c++的IO流(1)流,是是对一种有序连续且具有方向性的数据( 其单位可以bit,byte,packet )的抽象描述。为了实现这种流,c++定义了I/O标准库。(2)c++实现的庞大类库是以ios为基类,其他类是直接或间接派生自ios类的。(3)cerr、clo

2020-08-15 17:43:15 852

原创 【priority_queue、stack、queue模拟实现】

1、priority_queue模拟实现(1)priority_queue.h#pragma once#include<vector>namespace pz{ template<class T,class Container = vector<T>,class Compare = less<T>> class priority_queue { public: void AdjustUp(int child)//向上调整,大堆

2020-08-15 10:43:04 136

原创 【Stl配接器-stack和queue】

一、stack的介绍1、什么是stack(栈)?(1)stack是一种容器适配器,用在先进后出情境下,只能在容器的一端进行插入和删除操作。(2)二、queue的介绍三、priority_queue的介绍四、容器适配器...

2020-08-14 19:43:39 145

原创 【Stl-deque】

1、deque简介:(1)deque是双端队列,双端队列是动态大小的序列式容器,可以向两端进行伸缩。(2)deque通常是一种动态数组,允许随机访问。(3)deque在头尾进行插入和删除操作与vector类似,效率较高,但deque并不保证所有元素存储在连续空间中,以指针加偏移进行访问有可能会非法。(4)deque的内部实现比vector更加复杂,同时也使deque在某些特定情况下增长更加高效,尤其是序列比较大,重新分配成本比较高的情况下。2、deque基本使用(1)构造(1)无参构造

2020-08-12 08:11:00 106

原创 【list的模拟实现】

1、list的迭代器底层实现用一个类型去封装结点的指针,构成一个自定义类型,然后重载*和++等运算符,使其可以像指针一样进行使用。2、模拟实现list刚开始实现的初步工作就是实现一个双向循环链表,并且指向自己。...

2020-08-10 21:26:02 155

原创 【STL-list】

一、list简介1、为什么会有list?作为补充vector缺点而存在。vector是顺序表,list是链表。list和vector的区别实际上就是顺序表和链表的区别。vectro缺点:(1)头部和中部的插入删除效率低,o(N),需要挪动数据。(2)插入数据空间不够需要增容,增容需要开新空间、拷贝数据再释放旧空间,会付出很大的代价。vector的优点:(1)支持下标随机访问,间接支持排序、二分查找,堆算法等等。2、list优缺点:优点:(1)list头部、中间插入不再需要挪动数据,

2020-08-08 17:07:27 191

原创 【vector的模拟实现】

1、构造函数//无参构造vector() :_start(nullptr), _finish(nullptr), _endofstorage(nullptr) {}//拷贝构造1 vector(const vector<T>&v) { _start = new T[v.capacity()]; _finish = _start + v.size(); _endofstorage = _start + v.capacity();

2020-08-06 10:11:40 159

原创 【STL-vector】

一、vector简介1、 vector是表示可变大小数组的序列容器2、vector和数组一样采用连续空间存储数据,可用下标对其进行访问,效率很高。不同的是其大小可以动态改变是由容器自动处理的。3、vector插入一个数据,需要重新分配一个数组,并将所有元素移到这个数组。4、与其他容器相比,vector访问元素、末尾添加和删除元素效率更高效,不在末尾的添加和删除元素操作效率更低。二、vector的常用接口1、构造函数(1)vector():无参构造(2)vector(size_type

2020-08-06 09:44:24 206

原创 【字符串相加、相乘等】

1、反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。class Solution {public: void reverseString(vector<char>& s) { int i = 0 , j = s.size()-

2020-08-03 16:45:54 360

原创 【STL-string】

一、STL简介1、什么是STL?STL是是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包括数据结构与算法的软件框架。2、STL的六大组件仿函数、算法、迭代器、空间配置器、容器、配接器。3、STL的缺陷(1)STL库更新太慢(2)STL没有支持线程安全,并发环境下需要自己加锁(3)追求效率导致内部结构复杂(类型萃取等)(4)STL会导致代码膨胀(本质是模板语法导致的)二、String类1、string类简介(1)string类是表示字符串序列的类(2)其接口

2020-08-03 15:18:33 120

原创 【string的模拟实现】

1、简单string类实现(深拷贝)namespace pz{ class string { public: //构造函数,无参和带参的 string() :_str(nullptr) {} string(char* str) :_str(new char[strlen(str) + 1])//在堆上多申请一个空间存\0 { strcpy(_str, str);//再将数据拷贝到代码段 } string(const string&s)//深拷

2020-08-03 11:05:46 136

原创 【strcpy函数】

strcpy函数的使用strcpy()函数是C语言中的一个复制字符串的库函数。char * strcpy(char *dst,const char *src) { if((dst==NULL)||(src==NULL))return NULL;char *ret = dst; //[1]while ((*dst++=*src++)!='\0'); //[2]return ret;//[3] }一、const 修饰:源字符串参数用const修饰,防止修改源字符串;二、

2020-07-31 19:48:56 763

原创 【模板】

1、泛型编程编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础2、模板分为函数模板和类模板(1)函数模板什么是函数模板?解:代表了一个函数族,该模板与类型无关,在使用时被参数化,根据**实参类型产生函数的特定类型版本。template<typename T>void Swap( T& left, T& right){T temp = left;left = right;right = temp;}注:template是定

2020-07-26 14:37:44 109

原创 【了解单例模式】

1、设计一个类,只能在堆上创建对象方法:构造函数私有化将构造函数私有化,拷贝构造也要私有化(若对堆上创建的对象进行解引用并调用拷贝构造,同样可以在栈上创建对像。)提供一个静态函数,静态函数完成堆上对象的创建。class Test{ Test() { cout << "Test()" << endl; } ~Test() { cout << "~Test()" << endl; } Test(const Test&);/

2020-07-26 08:32:15 95

原创 【C/C++内存管理】

1、c/c++内存划分图栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量2、C语言内存管理方式动态内存管理(1) 为什么要有动态内存管理?因为常规空间开辟的方式,开

2020-07-23 08:42:57 152

原创 【指针传参问题C】

改变变量用一级指针,改变指针用二级指针1)改变值void fun(int *p){ int b = 100; p = &b; // 将p指向b,改变的是局部变量的值,实参不受影响}void fun2(int *p){ *p = 100; // 将p指向的变量赋值100,改变的是实参指针指向的值,实参会受到影响 //} //改变变量用一级指针,改变指针用二级指针,main(){ int .

2020-07-22 11:33:39 174

原创 【关于类的练习】

1、计算一个类创建了多少个对象#include<iostream>using namespace std;class temp{ static int a;public: temp() { ++a; } temp(const temp& b) { ++a; } static int GetA() { return a; }};int temp::a = 0;int main(){ cout << temp::GetA(

2020-07-21 15:24:28 171

空空如也

空空如也

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

TA关注的人

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