- 博客(119)
- 收藏
- 关注
原创 打卡day14
226. 翻转二叉树 - 力扣(LeetCode)101. 对称二叉树 - 力扣(LeetCode)104. 二叉树的最大深度 - 力扣(LeetCode)函数调用模型每次调用函数,都会在“调用栈”上分配一个新的栈帧(stack frame),用于保存该次调用的参数、局部变量和返回地址。递归调用本质上与普通的函数调用完全相同:只是函数体里直接写了对自己的调用。递归的必要条件基准情形(Base Case):函数内必须有一个「不再向下递归」的情形,否则会无限调用直至栈溢出。在 中,这个基准情
2025-08-05 22:01:07
706
原创 继续打卡day6
总结:这次有的题目第二次写了还是不会,归根结底是对原理不清楚,只是在背题解一样,要多理解为什么这样写的原理。还是不会处理这里的去重逻辑。
2025-07-29 22:53:56
207
原创 define ,typedef和using的区别
`typedef` | 关键字 | 为已有类型定义别名 | 是 | 是 | 否 | 是 || `using` | 关键字 | 为类型或命名空间定义别名 | 是 | 是 | 是 | 是 |`using` 是 C++ 中的关键字,**可以用于命名空间、类型别名以及继承**。
2025-07-19 10:00:00
656
原创 匿名函数作递归函数引用
方法核心思想优点缺点适用场景按引用捕获包装器✅ 通用,C++11即可用✅ 调用语法自然f(5)⚠️必须按引用捕获❌ 有轻微性能开销兼容旧标准 (C++11) 或需要将 Lambda 存入容器的场合。泛型 Lambda将自身作为参数传递✅ 高性能,无额外开销✅ C++14即可用❌ 调用和递归语法稍显繁琐f(f, 5)性能敏感,且使用 C++14/17/20 的现代 C++ 项目。(当前主流推荐)语言层面直接支持自引用✅ 语法最简洁、最优雅✅ 高性能。
2025-07-11 21:00:00
928
原创 【无标题】
想象一下,你想要对一个vector容器进行排序,但排序的规则比较特殊,不是简单的升序或降序。定义一个独立的全局函数或静态成员函数// 某种复杂的比较逻辑这种方式的问题是,可能只在这里用一次,却污染了全局或类的命名空间。它与使用它的代码(std::sort)在物理上是分离的,降低了代码的内聚性。定义一个函数对象(Functor)这种方式将函数和其状态封装在了一起,比全局函数要好。但问题是,为了一个简单的、只用一次的比较逻辑,就需要定义一个完整的struct或class。
2025-07-10 21:45:00
798
原创 NAT技术(网络地址转换)
NAT 是一项为了应对 IPv4 地址短缺而发明的伟大“变通”技术。它通过扮演一个“中间人”或“接线员”的角色,成功地让大规模的私有网络共享有限的公网资源。尽管它带来了一些副作用,但在IPv6(拥有近乎无限的地址空间,旨在消除对 NAT 的需求)完全普及之前,NAT 仍然是支撑现代互联网运作不可或缺的关键技术。
2025-07-10 11:20:46
790
原创 类模板的语法
类模板(class template)是 “类型的模板”——它将一个或多个类型参数或非类型参数抽象出来,让一个“通用的类框架”能在编译期被实例化成针对不同类型或不同值的具体类。通用代码复用静态多态在容器/工具类实现中最常见。
2025-07-09 20:00:00
313
原创 智能指针的注意事项
项目是否共享控制块❌ 否,各管各的✅ 是,共享引用计数是否多次delete❌ 可能✅ 不会是否会悬空指针✅ 有风险❌ 安全是否符合shared_ptr用法❌ 错误用法✅ 正确用法。
2025-06-27 15:18:58
226
原创 c++读写锁
读写锁,顾名思义,是一种将“读”和“写”两种操作区分开来对待的同步原语。它允许多个线程同时进行读操作,但只允许一个线程进行写操作。为了更好地理解,我们可以将其与标准的互斥锁 (std::mutex互斥锁 (std::mutex:非常“霸道”。无论线程是想读还是想写,只要一个线程锁定了资源,其他任何线程都必须等待,不管它们想做什么。这就像一个只有一个座位的房间,一次只能进去一个人。读写锁 (:更加“智能”和高效。它遵循以下规则:读-读共享。
2025-06-19 22:00:34
416
原创 左值引用和右值引用
指的是有确定存储位置(地址)的对象,通常可以出现在赋值语句左侧。例如:变量名、解引用指针得到的对象、数组元素等都属于左值。一般指临时对象或字面常量,通常没有固定的存储地址,只能出现在赋值语句右侧。例如:字面量(42"hello")、表达式求值产生的临时结果(a + b、函数返回的非引用类型)等都属于右值。T&T&含义:引用一个,必须绑定到一个具有名字且可寻址的对象上。作用:可以通过引用直接操作原对象,不产生拷贝;常用于函数参数(接收可修改的实参)或延长临时对象的生命周期(使用const T&T&&
2025-06-03 21:39:04
1204
原创 socket通信中的accept函数
m_sockfd参数输入 / 输出作用m_sockfd输入哪个监听 socket 来 acceptaddr输出客户端地址将被写到这里addr_len输入 + 输出告诉系统结构体多大、系统写入实际使用大小。
2025-05-16 10:19:38
524
原创 rsize和reserve的不同
函数改变size()改变capacity()构造元素常用用途reserve(n)❌ 否✅ 是❌ 否优化性能、减少扩容次数resize(n)✅ 是✅ 可能✅ 是设置真实元素个数。
2025-05-09 09:21:05
304
原创 在c++中static用在全局和局部有什么区别
在 C++ 中,static关键字的作用会根据其使用的上下文(全局作用域、局部作用域等)有所不同。
2025-05-08 16:36:18
899
原创 c++初始化结构列表
初始化列表不是赋值!必须用它来初始化 const、引用、无默认构造的成员和基类!成员初始化顺序由声明顺序决定,不是你列表里写的顺序!
2025-05-06 11:25:13
213
原创 静态成员变量和静态成员函数
public:// 仅声明:告诉编译器有这个变量count = 10;// ✅ 可以访问// 这一句是“定义 + 初始化”如果你没有这一句定义,即使你在foo()里使用countclass A {// ✅ 这不是定义类的静态成员变量,而是定义函数内的静态局部变量这里x是foo()里的局部变量,跟类成员无关。而A::x仍然必须类外定义。需求写法是否合法声明静态成员变量(类内)✅定义静态成员变量(分配内存)✅ 必须静态函数中访问静态变量x = 10;(类作用域内)✅。
2025-05-05 10:30:00
194
原创 new和malloc的区别
new= 分配内存 + 构造对象 + 类型安全 + 异常语义;malloc= 只要一块原始字节,剩下的你自己负责。掌握两者差异,才能在系统编程与高性能场景中游刃有余。是的,你理解得基本正确操作newdeletemallocfree内存分配自动完成手动构造函数调用自动(带参数或默认)❌ 不会;需手动析构函数调用自动❌ 不会;需手动对象->~类名()安全性 / 易错性高,配合 RAII 可防泄漏容易出错,忘构造或析构都会导致 UB 或泄漏malloc。
2025-05-02 15:07:11
614
原创 网络通信的字节序
如果还想看实际打印内存的 demo,告诉我,我可以再给你补代码。CPU 要先拿到这 4 个字节,然后再“解释”它们到底是哪一位是高位、哪一位是低位。→ 又回到了“一个值多字节”,这时才出现。不存在“系统偷偷给你变成 CBA”的情况。→ 跟普通字符串一样,不涉及字节序。→ 要把多字节拼成单个数 →。:把最低有效字节放在最低地址。:把最高有效字节放在最低地址。→ 没有再组合的步骤 →。1 字节 → 不用管字节序。统一到“网络字节序”。要做的事——它只在“1 字节 → 可能要管。是 → 需要统一字节序。
2025-04-25 15:41:50
276
原创 mmap和new/malloc的区别
PageCache 直接mmap匿名私有页,一次拿整块页对齐内存,避免进入 glibc 堆管理队列;这给了我们对页级切分、合并与回收的 100% 主动权。munmap让内存池可以把闲置 span 即时退回内核,避免双重碎片,并降低进程常驻集大小。“对多线程来说,我们绕过 glibc arena 锁,保证大块分配 O(1) sys‑call 成本,线程伸缩稳定。
2025-04-23 12:00:00
1245
原创 程序是怎么运行的
**链接器**将多个目标文件(如 `main.o`、`printf.o`)合并,解析符号引用(例如找到 `printf` 函数的实现地址),生成可执行文件(如 `a.out`)。- **步骤1**:CPU 从内存代码段读取指令 `movl $10, -4(%rbp)`,将立即数 `10` 写入栈上的变量 `x`(地址 `0x7ffd1234`)。- 预处理器处理 `#include`、`#define` 等指令,展开宏、包含头文件,生成预处理后的代码(`.i` 文件)。
2025-04-22 09:32:14
631
原创 代码是如何运行的?编译期和运行期的区分。
简单来说:编译时期:代码 → 机器指令的转换过程。运行时期:机器指令真正被 CPU 执行、程序运行的阶段。举例: 🚀 运行时期 (Runtime)程序真正运行时(CPU 执行时)做的事:举例: 🎯 三、如何快速区分编译时和运行时?(对照法) 特性 编译时期 运行时期 发生时间 编译代码时(程序未启动) 程序运行时(程序启动后) 处理对象 源代码 () 机器指令(二进制可执行文件
2025-04-21 10:29:20
969
原创 C++中const与constexpr的区别
**特性** | **编译时** | **运行时** || **对象构造** | 运行时构造 | 允许编译时构造(需 constexpr 构造函数) || **初始化时机** | 编译时或运行时 | 必须编译时 |
2025-04-17 14:58:43
824
原创 151. 反转字符串中的单词
去除多余空格利用快慢指针遍历字符串,原地复制单词并在单词之间插入单个空格。整体反转字符串将所有字符整体反转,这一步反转了单词的顺序,但单词内部也被反转。反转每个单词对每个单词分别再反转一次,使单词内部字符恢复正确顺序。返回结果得到的字符串即为“单词顺序反转且各单词间只有单个空格”的结果。这样整个处理流程既实现了去除多余空格,又完成了单词顺序反转,同时保留了每个单词内部字符的正确顺序。
2025-04-14 21:04:31
695
原创 Cmake常见指令
下面是经过大量实战提炼出来的最常用、最刚需、最清晰的 CMake 命令语法表,并附带功能备注说明👇📌 二、添加目标文件(执行程序 / 静态库 / 动态库)📌 三、包含头文件目录📌 四、链接库文件📌 如果链接系统库:📌 五、文件自动收集📌 六、设置输出路径(推荐的现代写法)📌 七、设置 C++ 标准版本📌 八、设置编译选项📌 九、设置库的输出名称或属性📌 十、指定源文件目录
2025-04-14 10:14:50
198
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人