
C++
文章平均质量分 54
blog_w
与其临渊羡鱼,不如退而求网
展开
-
字符输入验证函数
查找输入的字符串是否符合要求,通常用于限制用户在编辑框(如 CEdit)中只能输入特定格式的数据,例如数字、小数、时间格式等。**m_nDecialNum:**一个成员变量,表示允许的小数点后数字的位数(如设为2,则小数最多有两位小数)。**GetWindowText(strContent):**获取当前编辑框的内容。**GetSel(nStart, nEnd):**获取当前选中的文本范围。**m_bMinus:**一个成员变量,表示是否允许输入负号(负数)。原创 2025-04-20 15:27:59 · 172 阅读 · 0 评论 -
LeetCode:两个数组的交集--哈希表实现
349.两个数组的交集思路:1.利用哈希表存储nums1、nums2中元素2.判断哪个哈希表长,然后遍历较小的集合,判断其中的每个元素是否在另一个集合中,如果元素也在另一个集合中,则将该元素添加到返回值class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { //1.利用哈希表存储nums1、nums原创 2022-05-26 09:05:09 · 219 阅读 · 0 评论 -
LeetCode:二叉树层序遍历
102.二叉树的层序遍历思路:用队列实现层序遍历1.创建二维数组最终存放二叉树的每一层的元素2.创建队列实现每一层的遍历3.遍历3.1 先存放第一层节点3.2 遍历每一层的节点先确定每一层节点的个数,然后通过队列存储到一维数组中,最后插入到二维数组将每一层的元素存放到新的一维数组中3.3 将新数组元素插入到二维数组中4.返回二维数组/** * Definition for a binary tree node. * struct TreeNode { * int val原创 2022-05-25 09:43:24 · 371 阅读 · 0 评论 -
LeetCode:二叉树的中序遍历
94.二叉树的中序遍历方法一:递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), ri原创 2022-05-17 22:02:03 · 356 阅读 · 0 评论 -
LeetCode:144.二叉树的前序遍历
144.二叉树的前序遍历二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质。方法一:递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() :原创 2022-05-17 10:33:31 · 133 阅读 · 0 评论 -
LeetCode 153.寻找旋转排序数组中的最小值(官方解题分析)
153.寻找旋转排序数组中的最小值原创 2022-05-09 15:51:29 · 469 阅读 · 0 评论 -
Leetcode设计链表---单(双)链表
问题:7.7。设计链表问题分析:1.创建了结构体节点struct ListNode,成员变量有数据域和next指针域ListNode含有三种初始化列表(无参、单参、双参)2.创建了自定义链表MyLinkedList,成员变量有struct ListNode *head作为头结点, int size保存链表长度MyLinkedList无参构造函数–新建头结点,size初始化get(int index)–顺序遍历到索引为index的节点,返回valvoid addHead(int val)–先断原创 2022-04-28 16:35:03 · 967 阅读 · 0 评论 -
删除链表的倒数第N个节点----双指针解法
删除链表的倒数第N个节点思路:设有两个指针 p 和 q,初始时均指向头结点。首先,先让 p 沿着 next 移动 k 次。此时,p 指向第 k+1个结点,q 指向头节点,两个指针的距离为 k 。然后,同时移动 p 和 q,直到 p 指向空,此时 q 即指向倒数第 k 个结点。加个哑结点,可以方便删除,因为单链表删除需要知道删除节点前的那个节点/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2022-04-27 09:32:53 · 592 阅读 · 1 评论 -
LRU缓存--C++官方解法分析
LRU原理: 每次访问的数据都会放在栈顶,当访问的数据不在内存中,且栈内数据存储满了,我们就要选择移除栈底的元素,因为在栈底部的数据访问的频率是比较低的。所以要将其淘汰。题目分析:键值: 哈希表顺序存储: 想到栈、队列、链表如果关键字 key 已经存在,则变更其数据值 value ;可知:数据需要随机访问、需要把数据插入到头部或者尾部链表:实现数据插入到头部或者尾部哈希:实现随机访问在双向链表的实现中,使用一个伪头部(dummy head)和伪尾部(dummy tail)标记界限,这样在添加节原创 2022-04-27 09:25:12 · 426 阅读 · 0 评论 -
哈希表实现线性检测(超详细)
哈希表的线性检测:思路分析:1.哈希表定义 ----成员定义(private):存储方式(哈希节点的数组)、元素空间的大小、哈希表构造函数2.哈希表存入的数据类型: 哈希节点:哈希函数需要知道键值,因此键值数据设置成KV函数,同时哈希删除为假删除,因此需要定义状态3.哈希表的插入(插入哈希节点)3.1 检查容量载荷因子大于设置的0.7就扩容(哈希数组的有效元素比上空间大小 _size*10/_ht.size()),或者无空间(哈希数组_ht.size())扩容大小开辟新的哈希空间插入元素,原创 2022-04-04 22:19:15 · 1829 阅读 · 0 评论 -
LeetCode----80. 删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。80. 删除有序数组中的重复项 II不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。方法1:双指针class Solution {public: int removeDuplicates(vector<int>& nums) { /* 最多出现两次,表示前两位一定存在于nums数组中原创 2022-03-31 16:46:39 · 513 阅读 · 0 评论 -
leetcode---349.两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]两个数组的交集方法1:排序+双指针class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {原创 2022-03-30 17:35:35 · 286 阅读 · 0 评论 -
leetcode---206.反转链表
206.反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。class Solution {public: ListNode* reverseList(ListNode* head) { //1.迭代法 //1->2->3->4->5 ListNode* prev=nullptr; //定义1位置之前的前指针 ListNode* curr=head; //定义1位置的当前指针 while(curr)原创 2022-03-29 17:31:48 · 1907 阅读 · 0 评论 -
动态规划--斐波那契数列(剑指offer)
DP定义:动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。动态规划具备了以下三个特点把原来的问题分解成了几个相似的子问题。所有的子问题都只需要解决一次。储存子问题的解。动态规划的本质:是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)动态规划问题一般从以下四个角度考虑:状态定义状态间的转移方程定义状态的初始化返回结果状态定义的要求原创 2022-03-29 16:50:59 · 284 阅读 · 0 评论 -
socket---TCP通信
TCP通信流程的编写:通信流程:Server:1.创建套接字2.为套接字绑定地址信息3.开始监听告诉系统可以开始处理客户端的连接请求。系统会为每一个新客户创建一个新的套接字4.获取新建连接5. 收发数据(使用的是新建的套接字)6. 关闭套接字Client:1.创建套接字2. 为套接字绑定地址信息(不推荐主动绑定)3.向服务端发起连接请求(开始监听之后)4.收发数据5.关闭套接字接口认识:1.创建套接字:int socket(int domain, int type, in原创 2021-12-29 15:31:45 · 1253 阅读 · 0 评论 -
socket---UDP通信
通信流程:Server:1.创建套接字 — 在内核中创建一个socket结构体2.为套接字绑定地址信息在创建套接字创建的socket结构体中加入IP+PORT信息1.告诉操作系统主机收到的哪些数据应该交给当前的这个socket2.确定发送数据的源端地址信息3.接收数据当前进程从指定的socket接收缓冲区中取出数据4.发送数据将要发送的数据放到socket发送缓存区中,内核选择合适时候封装发送5.关闭套接字Client:1.创建套接字2.为套接字绑定地址信息 (大多数情况下会原创 2021-12-09 19:21:31 · 2206 阅读 · 0 评论 -
C++:函数模板
1.函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。2.函数模板格式template<typename T1, typename T2,…,typename Tn>返回值类型 函数名(参数列表){}template<typename T>void Swap( T& left, T& right){T temp = left;left = right;right = temp;}注原创 2021-04-09 19:50:23 · 92 阅读 · 0 评论 -
Linux:工具的使用
1.软件包管理工具:yum :类似于手机应用商店(管理当前系统中能够安装的工具以及可以卸载的工具,并且实现安装以及卸载操作)lrzsz::实现主机与虚拟机之间的联系1、查看所能安装的软件工具: yum list. 显示所有工具yum search keyword 根据关键字查找指定工具2、安装一个指定工具: yum install package name安装git:. sudo yum install gcc gcc-c++ gdb git3、卸载一个指定工具: yum remov原创 2021-03-24 14:33:26 · 138 阅读 · 1 评论 -
C++:内存管理
1.C++内存管理方式C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。1.1 new/delete操作内置类型#include<iostream>using namespace std;void test(){ //申请和释放的方式保持一致 //malloc---->free int* mptr = (int*)malloc(sizeof(int));原创 2021-03-20 10:54:42 · 123 阅读 · 0 评论 -
C++:类与对象(3)
1.赋值运算符重载1.1 运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)#include<iostream>using namespace std;class Date{public: Date(int y = 1, int m = 1,原创 2021-02-23 13:45:17 · 77 阅读 · 0 评论 -
C++:类与对象(2)
1.this指针1.1 this指针的引出我们先来定义一个日期类Date#include<iostream>using namespace std;class A{ int a;};class Date{public: //每一个非静态成员函数中,都有一个this指针 //作为函数的第一个参数 //this指向当前调用函数的对象 //this类型:类类型* const this void Display() //void Display(this) {原创 2021-02-21 19:01:32 · 97 阅读 · 0 评论 -
C++: 类与对象(1)
1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。//定义一个C++的类:和结构体的定义方式一样struct Student{ //成员函数 void SetStudentInfo(const char* name, const char* ge原创 2021-02-21 09:29:38 · 271 阅读 · 0 评论 -
C++: 指针空值nullptr
1. C++98中的指针空值在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:void test(){ int* p = NULL;//预处理,宏替换:int*p=0 int* p2 = 0;}NULL实际是一个宏,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻原创 2021-02-20 17:28:56 · 1569 阅读 · 3 评论 -
C++ : 内联函数 宏 auto关键字 范围for
1.内联函数概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。//内联函数:节省空间,不需要开辟临时空间inline int add(int a, int b){ return a + b;}void test(){ int a = add(10, 20); //实际编译时, int a= 10+20}int main(){ test(); return 0;}没有使用内联函数i原创 2021-02-20 17:04:54 · 275 阅读 · 0 评论 -
C++ 引用
1.引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。类型& 引用变量名(对象名) = 引用实体;注意:引用类型必须和引用实体是同种类型的。#include<iostream>using namespace std;struct A{ int a; int b; int c; int d; int e;};void tes原创 2021-02-19 17:36:00 · 112 阅读 · 0 评论 -
C++&C语言 函数重载
1.为什么C++支持函数重载,而C语言不支持函数重载呢?在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。//c++//int add(char a, char b);//char add(char a, char b);double add(double a, double b);int main(){ //int a = add(10, 20); //char b = add('a', 'b'); double c = add(2.0, 3.0);原创 2021-02-19 11:25:55 · 191 阅读 · 0 评论 -
C++ :输入&输出 缺省参数 函数重载
1.输入&输出说明:使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。使用C++输入输出更原创 2021-02-18 21:56:03 · 2806 阅读 · 6 评论