C/C++
文章平均质量分 71
简单记录对C/c++的一些思考
4C++
记录C++体系的学习
展开
-
前缀和---预处理数组的利器
前缀和(Prefix Sum)是一种在数组或序列上的计算技巧,通过对数组的预处理,可以快速计算给定区间内元素的总和。二维前缀和、一维前缀和原创 2024-05-04 18:59:14 · 864 阅读 · 0 评论 -
滑动窗口详解
滑动窗口是双指针算法中细分的一种,它由暴力枚举算法优化而来,解决的是同向双指针问题;当一个题目在暴力解法中发现枚举时其实可以不用把“指针”往回走,就可以使用滑动窗口的思想来解决。也就是滑动窗口通过题目的某种性质,忽略了很多无效枚举,维护两个指针间的区间保持某种性质,从而把时间复杂度从O(n^2)优化到O(n)只要题目的研究对象是一段连续区间或者能转化为一段连续区间,就可以考虑用滑动窗口来做,思路不清晰时可以先想题目的暴力枚举,从中优化而来。原创 2024-04-30 21:49:16 · 959 阅读 · 0 评论 -
【C++】map 和 set 的使用
STL的容器分为两类:序列是容器、关联式容器;序列式容器是线性的数据结构,只有存储元素的功能,且像vector、list等还可以指定插入位置;而关联式容器底层底层的数据结构是较高级的红黑树、哈希表等,里面存储的是结构的键值对,在数据检索时比序列式容器效率更高,但是数据的插入不能像vector那样指定插入位置,它底层有自己的插入逻辑,这样才来保证高效的数据检索能力。原创 2023-10-30 22:49:19 · 169 阅读 · 0 评论 -
二叉搜索树的实现(递归方式)
本文介绍了使用递归的方式实现BST的插入和删除操作,并提供了完整代码和测试案例。递归虽然简洁,但需要注意递归边界条件、参数传递方式等问题。在实际应用中,也可以使用迭代的方式实现BST的基本操作。原创 2023-10-26 16:06:44 · 212 阅读 · 0 评论 -
二叉搜索树的实现(迭代方式)
否则,从根节点开始,根据当前节点的键值与待插入键值的大小关系,沿着左子树或右子树逐步查找插入位置,直到找到一个空位置,然后创建新节点并插入。针对第4点,左子树的最右节点和右子树的最左节点,只有这两个节点能起到承上启下的作用,比所有的左子树节点都大,比所有的右子树节点都小;函数用于查找指定的键值。从根节点开始,根据当前节点的键值与目标键值的大小关系,沿着左子树或右子树逐步查找,直到找到目标键值或遍历完整个树。这段代码实现了BST的基本功能,包括查找、插入和删除操作,并且通过遍历删除的测试验证了代码的正确性。原创 2023-10-26 11:42:27 · 153 阅读 · 0 评论 -
C++:程序在mian函数执行前后做了哪些工作?
但需要注意的是,虽然某些编译器可能支持这种三个参数的形式,但它并不属于标准C++,因此代码依赖于该特性会导致与其他平台或编译器的不兼容性。如果需要使用环境变量相关的功能,建议使用操作系统或库提供的特定接口来处理环境变量,而不是依赖于。然而,根据C标准(ISO/IEC 9899:2018)的允许,这是最常见的用法,并且在大多数C++编译器中都得到支持。函数只有两种参数形式:无参数和带两个参数。按照C++标准规定,原创 2023-10-22 20:39:01 · 246 阅读 · 0 评论 -
C++:为什么析构函数一般写为虚函数
如果父类的析构函数没有声明为虚函数,那么delete时就只是一个普通的成员函数调用,只会调用父类的析构函数,造成析构不完全,在子类有指向外部的资源时(heap),会引发内存泄漏问题。,这种情况下,如果没有把析构函数写为虚函数,因为delete是先调用析构函数再释放内存空间,此时就只会调用基类的析构函数,造成了析构不完全,容易引发内存泄漏。,所以这里会构成多态调用,最终会调用子类的析构函数,在子类析构函数结束时会自动调用父类析构函数。如果没有继承关系,析构函数写不写为虚函数都可以。原创 2023-10-22 19:20:20 · 246 阅读 · 0 评论 -
进程的虚拟地址空间
对于C/C++程序员,我们看到的程序中的地址,都不是物理地址,而是操作系统映射的虚拟地址/线性地址,每一个进程都映射了同样结构的虚拟地址空间,让进程以为自己在独享内存资源,下图是以Linux下32位操作系统的虚拟地址空间分布图:平时程序中定义的静态局部变量,真的存放在函数栈帧里吗?并不是,而是存放在全局变量区域中,即.data段、.bss段堆栈两块区域是相对生长的,heap区域随着内存的分配向上申请内存资源;而stack区域在申请分配内存时则是向下生长的,但是注意,是!原因是什么呢?原创 2023-10-17 23:07:49 · 767 阅读 · 0 评论 -
C++继承探究
继承方式、作用域、菱形继承、虚继承、继承、组合继承可以理解为一个类从另一个类获取成员变量和成员函数的过程。成员变量继承一份给自己,成员函数和父类共用。被继承的类称为基类或父类,继承的类称为派生类或子类。派生类除了拥有基类的成员,还可以定义新的成员,以增强其功能。原创 2023-10-15 21:31:11 · 113 阅读 · 0 评论 -
vector用法
size为容器的有效元素,size=_last - _first_end - _first 为容器当前的最大容量。原创 2023-10-14 14:06:28 · 141 阅读 · 0 评论 -
通过Date类学习面向对象
通过手撸这个类的实现,我们可以学习到构造、析构、运算符重载,拷贝构造等面向对象中重要的知识。原创 2023-05-03 17:04:26 · 77 阅读 · 0 评论 -
C++中使用命名空间时的注意事项
在头文件中使用命名空间时,命名空间不能定义函数或变量,因为这可能会导致多个源文件中出现重复定义的链接错误。如果一定要在命名空间中定义变量,可以加上关键字`static`或`constexpr`,使其变成静态变量或常量。如果一定要在命名空间中定义函数,可以加上`inline`关键字,使其变成内联函数。在头文件中使用命名空间时,可以定义结构体和类,因为这些不是具体的实例。结构体和类的定义只是定义了一种类型,而不是实际的变量或函数。因此,在头文件中使用命名空间时,可以定义结构体或类,而不会导致链接错误。原创 2023-04-14 19:08:40 · 1210 阅读 · 0 评论 -
指针数组和数组指针
指针数组和数组指针常常用于复杂数据结构、函数参数传递等场景,应掌握其区别和使用方法。需要注意的是,由于两者定义时的类型不同,只能使用相应的操作符进行访问和修改。原创 2023-04-14 22:05:45 · 1278 阅读 · 0 评论 -
什么是设计模式?
设计模式在软件开发中扮演着非常重要的角色。提高代码质量和可读性 设计模式可以帮助开发人员遵循面向对象编程的最佳实践,从而提高代码质量和可读性。采用设计模式可以使代码更加模块化、易于测试和维护。增加复用性和灵活性 设计模式可以提供可复用的解决方案,避免开发人员在每个项目中都重新发明轮子。此外,它们还为开发人员提供了一种灵活的方式来对变化做出响应,从而增加了软件系统的灵活性和扩展性。促进团队协作 设计模式提供了一个共同的词汇和架构,使得整个团队可以更好地理解和交流彼此之间的想法和代码。原创 2023-04-16 22:46:48 · 600 阅读 · 0 评论 -
理解C语言中指针和数组之间的联系
在C语言中,指针和数组是两个非常重要的概念。虽然它们看起来可能迥然不同,但它们在操作内存时存在密切关系。事实上,数组名本身就是指向数组第一个元素的指针。原创 2023-04-14 22:00:06 · 774 阅读 · 0 评论 -
C++引用
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。此外,右值引用在使用时需要注意避免悬空引用的问题,即引用的对象已经被销毁而引用仍然存在的情况。引用是一个别名,它引用了另一个变量的地址。可以看到,引用底层还是开辟了一块空间来存储地址,使用引用来改值时,还是通过定义引用时存储的地址来对a的内存空间进行修改,和指针的实现方式类似。原创 2023-04-17 22:57:37 · 407 阅读 · 0 评论 -
C++缺省参数详解
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该 形参的缺省值,否则使用指定的实参。原创 2023-04-15 17:36:29 · 570 阅读 · 0 评论 -
C++简单工厂模式
简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在软件开发中,我们经常需要创建各种各样的对象,但是直接使用 new 关键字来创建对象会使代码变得复杂,而且不利于代码的可维护性和可扩展性。简单工厂模式通过将对象的创建与使用分离,可以使代码更加清晰、简洁和易于维护和扩展。它像是一家工厂,可以生产不同种类的产品。你只需要告诉工厂你需要什么样的产品,工厂就会帮你生产出来。这样就像是在商店里选购商品一样,你只需要知道你需要什么样的商品,不需要知道商品是怎么生产的,也不需要知道具体的生产流程。原创 2023-04-17 22:05:54 · 267 阅读 · 1 评论 -
C++中的this指针
this指针是一个指向当前对象的指针,在C++中非常重要。它可以让我们在成员函数中访问对象的成员变量和成员函数。在使用this指针时,需要注意指针的作用范围和指针的不可修改性。原创 2023-04-22 22:37:05 · 683 阅读 · 0 评论 -
C++内联函数详解
在C++中,我们可以通过在函数定义前加上关键字inline来定义一个内联函数。这里我们定义了一个名为add的内联函数,它接受两个整数参数x和y,并返回它们的和。由于我们在函数定义前加上了inline关键字,因此编译器会将该函数的代码在编译时嵌入到调用该函数的代码中,从而避免了函数调用的开销。需要注意的是,内联函数通常适用于函数体比较简单的函数,因为函数体过长的函数即使被定义为内联函数,也不一定能够提高程序的执行效率,甚至可能会降低程序的性能。`inline`只是给编译器一个建议。原创 2023-04-19 22:46:50 · 1135 阅读 · 1 评论 -
理解C语言中的空指针和野指针
在C语言中,指针是一个非常重要的概念,可以用于操作变量和数据结构。但是,指针也是很容易出错的地方。其中包括两种可能的错误:空指针和野指针。原创 2023-04-14 21:49:10 · 1663 阅读 · 0 评论 -
C++函数重载
函数重载是一种C++语言中的特性,它允许您定义多个具有相同名称但参数列表不同的函数。这对于编写可读性更好且更易于维护的代码非常有用。本文将介绍C++函数重载的概念以及如何在您的代码中使用它。函数重载是指在同一作用域内定义多个函数,这些函数的函数名相同,但参数列表不同。这意味着您可以使用相同的函数名来执行不同的操作。例如,您可能需要编写一个名为的函数,该函数可以打印整数、浮点数或字符串。使用函数重载,您可以定义三个不同的函数,每个函数都有一个不同的参数类型。以下是一个简单的C++代码示例,演示了如何使用函数重原创 2023-04-15 18:05:21 · 620 阅读 · 0 评论 -
C++构造函数
除了默认构造函数,我们还可以定义自己的构造函数来初始化对象的成员变量。自定义构造函数可以有多个参数,用于初始化对象的不同成员变量。有了自定义构造函数编译器不会再自动生成默认构造函数。age = a;在这个例子中,我们定义了一个带有一个参数的构造函数,用于初始化age成员变量。在这个例子中,我们创建了一个名为p的Person对象,并将其age成员变量初始化为20。原创 2023-04-22 22:50:50 · 588 阅读 · 0 评论 -
【C语言导图】总大纲
C语言 知识点原创 2023-03-02 18:28:43 · 94 阅读 · 1 评论 -
C语言中数据的存储
前面说过, 1≤M原创 2023-01-04 20:38:32 · 105 阅读 · 1 评论 -
STL---基本概念
1. 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。2. 算法:各种常用的算法,如sort、fifind、copy、for_each等。有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表 等。能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。:强调值的排序,序列式容器中的每个元素均有固定的位置。:二叉树结构,各元素之间没有严格的物理上的顺序关系。原创 2022-12-24 22:50:14 · 243 阅读 · 1 评论 -
C语言中指针类型的意义
当指针类型与其所指向的数据类型对应时,可以在连续的内存空间中指向程序员想指的元素。所占的内存大小在同一架构下也都是一样的(4or8字节),那么指针还分那么多的类型的意义是什么呢?关于访问的是a所占的四个字节中的哪一个字节,这与大小端字节序存储有关,此处不详谈。&a本身是一个int*的类型,但通过强制类型转换赋值给char*类型的指针p。这样做的好处是,在连续的内存空间中,指针±整数时,指针就会指向下一个元素的地址。无论哪种类型的指针他们的值都是一种类型:地址编号,那么在计算机中的存取方式也是相同的。原创 2022-11-27 13:46:01 · 472 阅读 · 4 评论 -
指针常量与常量指针
C/C++,指针常量与常量指针,所以在写代码时,如果要把一个变量的地址赋值给指针,若变量本身被const修饰,那么应该把地址赋值给常量指针,避免通过指针修改了变量本身。不能通过该指针修改其指向的值,即如果用常量指针操作指向的数据时,只能读不能写。先记住指针常量,联系数组名的值是一个地址,也就是地址常量,其实地址常量等价于指针常量。那么因为知道数组名的值(自身值)是不能改变的,而数组内的元素(指向的值)是可以改变的。不能改变存储的地址,即不能改变指针的指向。以上代码本意是a的值不可修原创 2022-11-26 14:18:19 · 2044 阅读 · 2 评论 -
结构体、指针、数组
1.结构体,指针都是数据类型中的一员,抛开其特殊的点,它们其实和int char...这些无异,在定义一个变量的时候用法,格式都一样与其他数据类型不同的是: 结构体是可以程序员自定义的,那些基本数据类型都可以作为积木构造各式各样的结构体来满足程序员的需求 创建的每一个结构体都要为其命名 以后要用到这个结构体的时候,起的名字就当作数据类型(纯C语法必须在前面加上struct关键字,cpp语法中可省略)2.指针,顾名思义,它的功能就像一个指针一样,为计算机指向对应的内存空间原创 2022-11-25 14:22:35 · 1081 阅读 · 1 评论