- 博客(20)
- 收藏
- 关注
原创 vector的reserve的“坑“
它的 “坑” 本质是使用者的认知偏差:把它当成resize、滥用预分配、忽略非 POD 类型的拷贝规则、误解缩容逻辑。当你能明确知道 vector 最终需要存储的元素个数(或大致上限),且元素个数较大(避免多次扩容拷贝)时,用 reserve 提前预留容量—— 比如读取一个 1000 行的文件,提前,避免 vector 从 1→2→4→…→1024 的多次扩容拷贝。除此之外,盲目用 reserve 只会导致内存浪费或 bug,这也是它被很多人吐槽 “坑” 的原因。reserve 只保证容量≥n,不负责收缩。
2025-11-18 11:29:19
731
原创 C++ 模板:泛型编程的艺术与实践
模板是 C++ 的一种语言特性,它允许我们定义 "代码蓝图",在使用时再指定具体的数据类型。简单来说,模板让我们可以写出像 "处理任意类型的容器"、"实现通用算法" 这样的抽象代码。函数模板(Function Template)类模板(Class Template)// 类模板:泛型栈private:// 使用vector存储元素public:// 入栈操作// 出栈操作if (!empty()) {// 获取栈顶元素T& top() {// 检查栈是否为空。
2025-08-13 16:00:06
409
原创 C++ 拷贝构造函数详解:从原理到实践
拷贝构造函数是一种特殊的构造函数,用于通过已有对象创建新对象时进行初始化。它的主要作用是将一个对象的状态复制到另一个新创建的对象中。public:// 拷贝构造函数// ...当类中包含动态分配的资源(如指针)时,必须显式定义拷贝构造函数实现深拷贝默认拷贝构造函数仅执行浅拷贝,可能导致内存问题可以通过delete关键字禁用拷贝构造函数拷贝构造函数在对象初始化、值传递和函数返回时被调用掌握拷贝构造函数的原理和实践,将帮助你避免许多常见的 C++ 内存错误,写出更健壮的代码。
2025-08-13 15:51:20
547
原创 c++析构函数
7. 如果类中没有申请资源时,析构函数可以不写,直接使⽤编译器⽣成的默认析构函数,如Date;5. 跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会。6. 还需要注意的是我们显⽰写析构函数,对于⾃定义类型成员也会调⽤他的析构,也就是说⾃定义类。果默认⽣成的析构就可以⽤,也就不需要显⽰写析构,如MyQueue;若未显式定义,系统会⾃动⽣成默认的析构函数。2. ⽆参数⽆返回值。4. 对象⽣命周期结束时,系统会⾃动调⽤析构函数。⾃⼰写析构,否则会造成资源泄漏,如Stack。
2025-07-08 15:07:45
177
原创 C++构造函数
5. 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显。6. ⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数,都叫做默认构造函。7. 我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始。默认构造,实际上⽆参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调。对于⾃定义类型成员变量,要求调⽤这个成员变量的默认构造函数初始。如果这个成员变量,没有默认构造函数,那么就会报错。1.函数名与类名相同。
2025-07-07 15:50:05
186
原创 初识 C++:从 Hello World 到面向对象
C++,一门强大而复杂的编程语言,在计算机科学领域占据着举足轻重的地位。今天,就让我们一起走进 C++ 的世界,从最基础的 Hello World 开始,逐步揭开它的神秘面纱。这只是 C++ 世界的冰山一角,还有更多精彩的内容等待你去探索,例如指针、引用、模板、STL 等等。学习 C++ 需要耐心和毅力,但只要你坚持不懈,终将掌握这门强大的编程语言,并利用它创造出令人惊叹的程序!程序并非总是顺序执行,我们需要根据条件选择不同的执行路径,或者重复执行某些代码块。:主函数,程序执行的入口。
2025-03-06 20:35:44
430
1
原创 深入理解 Linux 权限:保障系统安全与管理的基石
Linux 权限管理是系统管理的核心内容之一,掌握好权限的设置和管理,能够有效地保障系统的安全和稳定运行。通过理解不同用户类型、权限类型及其表示方法,熟练运用权限操作命令,合理设置特殊权限,你将能够更好地管理 Linux 系统中的文件和目录,确保数据的安全和访问的合理性。在日常使用和系统管理中,不断实践和总结经验,将使你在 Linux 权限管理方面更加得心应手。
2025-02-10 17:15:40
708
原创 Linux 基础指令全解析
在 Linux 操作系统的世界里,指令是我们与系统交互的重要工具。无论是系统管理、文件处理还是程序开发,掌握基础的 Linux 指令都能让我们事半功倍。接下来,就让我们一起走进 Linux 基础指令的奇妙世界。
2025-02-07 20:04:46
352
原创 快速排序(Quick Sort)算法详解及 C 语言实现
快速排序是一种非常高效的排序算法,具有较低的平均时间复杂度 O(n log n),并且适用于大规模数据的排序。在实际应用中,快速排序由于其高效性和简单性,成为了许多排序算法的首选。通过合理选择基准元素和优化分割策略,可以最大限度地提高排序性能。
2025-01-22 16:59:28
564
原创 数据结构排序算法
冒泡排序、选择排序、插入排序和希尔排序都是 C 语言中较为基础的排序算法。尽管冒泡排序、选择排序和插入排序的时间复杂度较高,但它们是理解排序概念和编程逻辑的基础。而希尔排序作为一种改进的插入排序算法,在效率上有了显著提升。在实际应用中,对于大规模数据的排序,我们可能会选择更高效的排序算法,如快速排序、归并排序等。但这些基础算法是学习更复杂算法的基石。希望通过这篇博客,你对 C 语言中的排序算法有了更深入的了解,也能在编程实践中灵活运用这些知识。
2025-01-14 14:22:24
298
原创 《深入理解堆排序(附 C 语言代码)》
堆排序是一种高效且稳定的排序算法,它的时间复杂度为O (nlogn) ,在很多场景下都有着不错的应用。理解堆排序的关键在于掌握二叉堆的概念以及建堆、排序这两个核心步骤的实现逻辑。希望通过这篇博客以及代码示例,能让大家对堆排序有更清晰的认识和理解,并且可以自己动手实践起来哦。如果大家有任何疑问或者建议,欢迎在评论区留言交流呀。
2024-12-22 20:17:50
387
原创 《C 语言实现堆数据结构》
首先,我们定义堆的数据结构,它包含一个指向存储堆元素数组的指针以及当前堆中元素的个数。int size;} MaxHeap;通过以上代码实现,我们在 C 语言中成功构建了一个最大堆数据结构,并实现了插入、获取堆顶元素、删除堆顶元素以及销毁堆等基本操作。堆数据结构在很多实际应用中都非常有用,例如在操作系统中的进程调度(根据优先级构建堆)、数据压缩算法中的哈夫曼编码等。理解和掌握堆的实现原理对于深入学习算法和数据结构具有重要意义。
2024-12-19 14:09:28
455
原创 数据结构二叉树
光有图还不够严谨,二叉树的定义是这样的二叉树(Binary Tree):是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。定义就是这样,好像并不清楚,简而言之 满足以下两个条件的树就是二叉树:1.本身是有序树;2.树中包含的各个结点的度不能超过 2,即只能是 0、1 或者 2;如图所示,a的度最多是2,所以是二叉树,而b有度为3的结点,所以不是二叉树!// 定义二叉树节点结构体int val;
2024-12-18 18:31:51
681
1
原创 C语言指针与结构体
在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。因此,对于结构体指针指向的结构体成员项,给出了另外一种简洁的表示方法为:结构体指针名->成员名。结构体数组在定义的同时也可以进行初始化,并且与结构体变量的初始化规定相同,只能对全局的或静态存储类别的结构体数组初始化。其中的结构体名必须是已经定义过的结构体类型。
2024-06-22 18:59:04
324
4
原创 【C语言】贪吃蛇【附源码】
然后,在 main() 函数内部,通过 #pragma warning (disable:4996) 关闭了编译器的警告提示,可能是因为某些函数被认为是不安全的。使用 for 循环遍历蛇的身体,将光标跳转到每个蛇身体部分的位置,并打印蛇身体的图标,这里使用了 "□" 表示蛇身体。使用 switch 语句,根据当前的移动方向来调用 run 函数,实现蛇的移动,并更新 tmp 记录的当前移动方向。如果蛇尾的位置不是 (0, 0),则将光标跳转到蛇尾的位置,并将该位置打印为空格,即将蛇尾覆盖掉。
2024-06-22 18:40:24
1937
2
原创 指针的基本认识
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
2024-06-22 13:59:25
475
原创 C语言分支循环语句
通过运行结果来看打印了1,2,3,4之后就死循环了,说明在执行continue语句之后的语句就没有被执行导致调整部分无法调整,才会出现死循环。while循环的执行流程:While循环是先进入判断表达式判断为真,执行语句,然后循环变量加1,如果为假跳出循环,判断条件至少要执行一次。我们通过这些验证方式我们得出break语句在while语句的作用是永久的终止循环,只要遇到break循环,循环就终止。for循环的执行过程:先执行初始化部分(只会被执行一次),再执行判断部分,然后执行循环语句,最后执行调整部分。
2024-03-02 14:18:35
940
原创 vs调试快捷键
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息。Ctrl+E,U / Ctrl+K,U: 取消选定注释内容。Ctrl+B,N / Ctrl+K,N: 移动到下一书签。CTRL + K, CTRL + U取消对选择代码的注释。Ctrl+B,T / Ctrl+K,K: 切换书签开关。Ctrl+E,C / Ctrl+K,C: 注释选定内容。CTRL + K, CTRL + L取消remark。CTRL + SHIFT + END选择至文档末尾。CTRL + M, CTRL + O折叠代码定义。
2024-01-24 12:07:15
1503
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅