C++
文章平均质量分 93
凤 曦
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++:关于IO流
在C++中,额外增加了许多IO的特殊机制,这些机制都在头文件中。C++是在C语言基础上改进的语言,要兼容C语言的绝大部分内容,自然包括C语言本身的IO机制。对于标准输入而言,C++使用、,而C语言使用、。它们的功能相同,挑选一个使用即可,但是免不了会有用户两个版本交替使用,此时就可能带来同步问题。因此C++中没有自己的缓冲区,而是与共用缓冲区,这样就算混用两者,也不会造成输出错误。但是正因为兼容了,就要去做很多额外的工作,那么的效率就会下降,为此,C++也提供了接口用于处理C/C++之间的同步问题。默认,也转载 2024-09-13 16:15:23 · 1075 阅读 · 0 评论 -
C++:新—类型转换
以上所有类型转换,都是旧式的,是基础C语言的显式与隐式的规则,衍生出来的各种类型转换。:从 派生类指针/引用 向 基类指针/引用 的转换,本质上是赋值兼容,一般来说是安全的。的转换不是指编译器帮你确认安全,而是说程序员自己确定了这个转换是安全的之后,再用。修改的变量,其实修改的是栈区中的数据,没有修改寄存器的数据,因此访问。实际上,C++的常量不存储在常量区,而是存储在栈区,而编译器会对。注意的是,类型转换的返回值是固定的,所以。即可,因为这是一个比较安全的行为。这是非常激进的指针类型转换,在编译期完成,转载 2024-09-12 23:11:10 · 1177 阅读 · 0 评论 -
C++:智能指针
内存泄漏是指程序在后,忘记或无法释放已经不再使用的内存,从而导致系统内存资源被逐渐耗尽的问题。这种情况下,即使程序本身并没有出现逻辑错误,也会因为内存泄漏而导致程序运行时间越来越长,甚至最终崩溃。RAII就是一种自动管理资源的机制,其可以帮助程序员自动释放资源,来避免内存泄漏,C++中,智能指针就是基于RAII产生的。原创 2024-09-12 20:51:39 · 1230 阅读 · 0 评论 -
C++:异常
一旦Division抛出异常,那么就是Func发生了异常,此时try就可以检测到,由于抛出的异常是const char*,我们要检测该类型的异常,所以catch的参数就是const char*了,catch (const char* errmsg)。4.抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被。在实际开发中,由于异常抛出的类型是不确定的,公司内部一般会约定好如何抛异常,而异常继承体系是最优秀的一套体系。原创 2024-07-14 19:38:43 · 914 阅读 · 0 评论 -
C++:lambda表达式和包装器
在寄快递的时候,快递会进行一次包装,这样我们就可以统一的在上面贴上快递信息,随后以统一的形式管理所有快递。比如这个f1最后拿到了这个bind封装的函数,那么f1(3, 5)执行的并不是3 - 5,而是5 - 3。如果直接通过变量名捕获,此时是传值调用,修改函数体内部的变量,不会影响父作用域的变量。只要所有返回值和参数列表相同的可调用对象,经过这一层封装,都会变成相同的类型。是通过捕获列表捕获的变量,传入的参数带有const属性,不允许修改。的作用,其名称为捕获列表,可以捕获父作用域中所有变量。原创 2024-07-12 15:05:35 · 891 阅读 · 0 评论 -
C++:初始化&声明
以上代码中,最外层的{ }括起来的就是一个initializer_list,内部的三个{ }则是三个不同的pair,不过const char*可以转为string,因此最后pair会变成pair。保证了指针类型的稳定,空指针不会被传递到指针以外的类型。的适用范围,其可以用于所有的内置类型和自定义类型的初始化。可以检测一个变量的类型,并且拿这个类型去声明新的类型。原创 2024-07-12 14:11:11 · 421 阅读 · 0 评论 -
C++:右值引用
以上代码中,函数say_hello生成了一个string,并把它返回给外部,如果我们直接返回,那么str1接收参数时,就会先拷贝构造出一个临时变量,然后临时变量再拷贝构造str1。虽然说我们的左值引用,也可以达到这样的移动构造,但是有一个问题,并不是所有的对象,资源都是可以被转移走的。就是这样的一个逻辑闭环,右值引用以一个既安全,又高效的方式,完成了局部变量的资源拷贝问题。确实是这样的,当右值引用了。当右值引用了常量,引用会把常量区中的数据拷贝一份到栈区,然后该引用指向栈区中拷贝后的数据。原创 2024-07-12 13:39:46 · 1352 阅读 · 0 评论 -
C++:哈希表
如果我们想要搜索这个数据,直接计算出这个数据的下标,然后就可以直接访问数组对应的位置,所以可以用O(1)的复杂度直接找到数据。当这个哈希表越满,我们查找数据的效率就越低,甚至说:如果查找一个不存在的数据,我们可能要用O(N)的复杂度遍历整个哈希表.因此我们因该把哈希表的负载率控制在一定值,当超过一定值,我们就要进行扩容操作。闭散列,也叫做开放定址法,当发生哈希冲突时,如果哈希表没有被装满,说明哈希表中还有空位置,那么我们可以把发生冲突的数据放到下一个空位置去。转化的函数,被写为了一个模板,而这个。原创 2024-07-12 10:56:01 · 1174 阅读 · 0 评论 -
C++:对set和map的封装
2.cur->_kv.first这个过程是有问题的,其意图通过找到key值,然后比较当前节点与查找节点的大小,来决定下一步去左子树还是右子树找节点。但是我们对RBTreeNode改造后,其内部存储的已经不是_kv了,而是_data,对于set而言,这个_data是没有first这个成员的,因此我们不能直接通过_kv.first这种方式来访问key。有一个注意点,在typedef的时候,由于我们的RBTree是一个模板,我们到模板的域中访问了变量。,此时我们存储的数据就不一定是键值对的格式了。原创 2024-07-12 09:45:39 · 564 阅读 · 0 评论 -
C++:红黑树
当。原创 2024-07-11 20:21:10 · 1127 阅读 · 0 评论 -
C++:AVL树
其不会影响自身的AVL结构,所以不用对自生做操作,但是由于其高度增加了,所以有可能会影响其父节点,那么此时我们就要去看看父节点是否平衡。一般的二叉搜索树在插入新节点以及删除节点时,都有可能会破坏树的平衡,所以AVL树需要对插入以及删除接口做修改,每次插入删除时,都要检测一下当前的树时候符合AVL树,如果不符合,要做出相应的调整措施。,称为平衡因子(balance factor),其值为左右子树高度的差值,当这个差值的绝对值>=2,就说明这个节点的左右子树不平衡,那么我们就要使用相应的手段调整这棵树。原创 2024-07-11 19:32:06 · 989 阅读 · 0 评论 -
C++:set和map
map的插入后,不论成功与否,都会返回一个pair<iterator, bool>,iterator用于指向key的迭代器,bool用于标识插入是否成功。而map的节点是pair<key, value>,所以我们解引用得到了一个pair,随后通过( ).second访问pair<key, value>的second,也就是value。它是基于红黑树实现的,它可以存储不重复的元素,并且会自动按照元素的大小进行排序。中的每个元素都由一个键和一个与之关联的值组成,键和值可以是任意类型。的类型)来调用默认构造。原创 2024-07-11 18:40:12 · 1043 阅读 · 0 评论 -
C++: 二叉搜索树
这是一个比较现代的赋值重载,注意我们在传参时BSTree t不是一个引用,而是一个不同的参数,此时参数t是实参的一份拷贝,是通过拷贝构造创建的,然后我们把这个形参拷贝构造出来的树直接交换给自己: swap(_root, t._root);首先,既然要删除特定的节点,那么我们就要先查找到该节点。既然要修改该节点,那么也要查找到其父节点,这个思路与前面的插入接口非常相似。想要拷贝一棵树出来,我们也需要进行递归式的深拷贝,不过由于要先有父节点,再有子节点,所以要用前序遍历。这个调用是存在问题的,那就是。原创 2024-07-11 18:07:08 · 690 阅读 · 0 评论 -
C++:多态
先看到多态的定义:C++的多态是指在中,允许使用基类的指针或引用来调用派生类的虚函数的特性。这样的调用将根据对象的实际类型来动态绑定到适当的函数实现,实现了不同对象调用相同函数的不同行为。原创 2024-04-20 18:32:53 · 922 阅读 · 0 评论 -
C++:继承
继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。在软件开发过程中,我们经常会遇到需要为多个类添加相同的行为或属性的场景,这样就产生了代码重复的问题。为了解决这个问题,工程师们开始寻找一种方法来实现代码的复用。继承就是一种解决代码复用问题的方式。它允许我们创建一个新的类,继承自一个已经存在的类,从而继承和复用父类的属性和方法。通过继承,我们可以在不改变父类的前提下,为子类添加额外的属性和方法,实现功能的扩展。原创 2024-04-20 17:22:03 · 716 阅读 · 0 评论 -
C++:stack&queue&priority_queue容器适配器介绍
栈(stack)是一种先进后出(Last-In-First-Out,LIFO)的数据结构,它的特点是只能在栈的一端进行插入和删除操作。由于大堆要保证每隔父亲节点大于两个子节点,而除去最后一个节点,其它的节点已经满足堆结构了,所以此处需要将最后一个节点不断地与其父亲节点比较,如果其比父亲节点大,就交换位置,然后继续和新的父亲节点比较,直到比当前的父亲节点小,或者到达堆顶为止。但是至此我们的优先级队列还不是完全体,因为其只能固定是大堆/小堆,或者说优先级的比较方式是固定的,想要解决这个问题,我们就需要仿函数。原创 2024-04-20 16:39:07 · 1122 阅读 · 0 评论 -
C++:由list引入迭代器
现在由于我们是反向迭代器,我们的反向迭代器++,其实就是正向迭代器的–。原创 2024-04-20 15:54:46 · 954 阅读 · 0 评论 -
C++:vector的介绍
C++的vector是一种可变长度的,被广泛用于C++编程中。它是标准模板库(STL)中的容器之一,提供了比原始数组更灵活和方便的操作。vector可以存储任意类型的元素,包括基本类型(如整数和浮点数)和自定义类型(如类和结构体)。它的大小可以根据需要动态调整,而不需要手动管理内存。vector支持随机访问,即可以通过下标直接访问容器中的元素。它还提供了一系列的成员函数和操作符,如插入、删除和查找等,使得对元素的操作变得更加方便和高效。vector。原创 2024-04-20 10:16:27 · 917 阅读 · 0 评论 -
C++:模板初阶
当我们希望把一些类中的成员定义在类的外部时,那就需要声明和定义分离。假设我们希望分离析构函数~stack。//声明private://函数体所以我们的类模板也要类型::函数名来限定作用域。类模板的类型刚刚介绍过,就是stack//函数体对于类模板,当在类外定义函数时,要添加模板参数列表。//函数体。原创 2024-04-20 09:54:50 · 1076 阅读 · 0 评论 -
C++:string的介绍
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。所以在C++的STL库中提供了更加方便的string类。原创 2024-03-08 16:41:35 · 1137 阅读 · 1 评论 -
C/C++的内存分配
使用方法:realloc函数的原型为void *realloc(void *ptr, size_t size),其中ptr参数是之前由malloc或calloc分配的内存空间的指针,size参数表示新的内存空间大小。定位new在一些特定的情况下非常有用,例如在实现自定义的内存管理时,或者在某些嵌入式系统中,需要将对象放置在特定的内存地址上。其中,指针是一个指向已经分配的内存的指针,类型是要创建的对象的类型,参数列表是对象构造函数的参数。是一个数组定义过程,也是一个普通变量,被存储在A栈区。原创 2024-02-13 14:14:16 · 891 阅读 · 1 评论 -
C++:static成员和友元函数
C++的静态成员是指在类中使用关键字"static"声明的成员变量或成员函数。静态成员与类的实例无关,而是与整个类相关联。它们在内存中只有一份副本,无论创建了多少个类的实例。静态成员变量:静态成员变量是属于整个类的,而不是类的每个实例。所有的实例共享同一个静态成员变量的值。它们在类的所有实例之间保持一致。静态成员变量必须在类的定义外部进行初始化。想要访问静态成员可以用:或者 静态成员函数:定义静态成员函数只需要在函数名前加一个关键字即可友元在C++中,可以使用友元函数和友元类来突破封装转载 2024-02-13 00:32:09 · 573 阅读 · 1 评论 -
C++:六个默认成员函数
C++把类型分为内置类型(基本类型)和自定义类型。基本类型:C++语言自己提供的数据类型,如:int,char…自定义类型:我们使用class/struct/union等自己定义的类型。转载 2024-02-13 00:01:23 · 869 阅读 · 1 评论 -
C++:this指针
即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。根据之前的博文,我们得知了类中的成员函数是处在一个公共的区域,类中的成员变量仅仅只是声明,只有在主函数内部定义了 以类为类型的变量,才算是开辟了成员变量的空间。所以因为找不到,也就是说编译器觉得这个是没有用的,所以空指针的效果是无效的,因为空指针无效,语法也没有问题,并且因为需要知道调用的函数的对象是谁,C++引入了一个隐藏的。原创 2024-02-12 21:54:30 · 1042 阅读 · 1 评论 -
C++:类的介绍
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::成员变量命名规则的建议:我们看看这个函数,是不是很僵硬?class Datepublic://这里的year到底是成员变量,还是函数形参?所以一般都建议这样class Datepublic:private:int _year;原创 2024-02-12 16:40:25 · 1083 阅读 · 1 评论 -
C++:与C语言相比的特点
看到一个示例:原创 2024-02-12 15:52:01 · 1063 阅读 · 1 评论
分享