
C++语法
文章平均质量分 85
C++
23级二本计科
这个作者很懒,什么都没留下…
展开
-
C++ 特殊类设计 类型转换
1.内置类型转自定义类型class Apublic:A(int a):_a1(a),_a2(a){}:_a1(a), _a2(b){}private:int _a1;int _a2;int main()//单参数隐式类型转换A a = 1;//多参数隐式类型转换内置类型转为自定义类型的关键在于是否有对应的构造函数。2.自定义类型转为内置类型。原创 2024-08-11 10:55:54 · 1010 阅读 · 0 评论 -
C++智能指针
在抛异常过程中我们可能会内存泄漏的问题。原创 2024-08-08 19:35:17 · 983 阅读 · 0 评论 -
C++ 异常
如果我们随便抛出异常的类型,外面必须有对应匹配的catch,那么有没有一种统一的方法接收异常。我们一般定义一个基类包含虚函数。抛异常时返回对应的派生类,在派生类中重写虚函数包含这种异常的相关信息,外面用基类接收,实现多态调用虚函数获取异常。//基类public:, _id(id){}protected:int _id;//生成不同的派生类,包含不同的异常信息public:{}return str;原创 2024-08-06 12:30:41 · 595 阅读 · 0 评论 -
C++11包装器function
请问func()是什么?原创 2024-08-04 14:45:00 · 442 阅读 · 0 评论 -
参数包 emplace_back lambda
我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数。我们虽然可以通过sizeof...(args)得到形参的个数,但不能遍历形参,语法不支持args[i]获取形参。下面有两种方法获取每个形参。原创 2024-08-03 10:31:53 · 733 阅读 · 0 评论 -
类的新功能(移动构造 移动赋值)
5. 取地址重载6. const 取地址重载。原创 2024-07-31 17:57:15 · 299 阅读 · 0 评论 -
C++ 右值 左值引用
在C++11前都是在mian()函数中定义ret再传给operator+(),延长生命周期。这时候就需要forward<T>()完美转发,保持参数属性,左值还是左值,右值还是右值。因为在传参时右值变为了左值,导致调用Fun()函数时t参数的属性永远是左值。注意区分右值引用和万能引用:下面的函数的 T&& 并不是万能引用,的 && 表示右值引用(比如:int&& ,string&&),将一个对象的资源转到另一个对象上。中的 && 不表示右值引用,而是。首先我们要了解什么是万能引用。为什么都调用的左值引用呢?原创 2024-07-31 13:30:00 · 1544 阅读 · 0 评论 -
unordered_map unordered_set函数实现
因为要访问HashNode HashTable结构,但它们的实现在HashIterator的后面,况且HashTable实现也需要迭代器。迭代器中只有指向Node的指针,遍历完一个桶后,就找不到下一个桶的位置了。插入规则:对插入的值进行size()大小的取模,eg.14%10=4 头插到下标为4的节点处。哈希桶结构:有一个size()大小的顺序表,表中节点存储的是插入节点的指针Node*。删除节点后,顺序表中存入它的下一个节点的指针。这里定义的Node结构,它没有自己的析构函数,我们要手动释放空间。原创 2024-07-29 11:51:15 · 661 阅读 · 0 评论 -
set map函数实现
insert返回的是pair<iterator , bool>类型,传的参数是类型是T。我们想要的是如果pair.first值相同,就不插入。我们找到operator[]底层也是套用的insert(),key值存在就可以修改它的value,不存在可以新建。注意end()我们返回的是nullptr,需要特殊处理end()--就到了中序遍历的最后一个节点也就是最右节点。同理,当这个节点的左子树子树遍历完时,以这个节点为根的子树就遍历完了。当这个节点的右子树子树遍历完时,以这个节点为根的子树就遍历完了。原创 2024-07-24 21:37:50 · 679 阅读 · 0 评论 -
红黑树性质+代码实现
如果定义为黑色,那么为了保持每条路径的黑色节点个数一致,我们还需对所有路径进行调整。而。原创 2024-07-22 17:22:34 · 750 阅读 · 0 评论 -
AVL树 相关函数实现
假如以pParent为根的子树不平衡,即pParent的平衡因子为2或者-2,分以下情况考虑1. pParent的平衡因子为2,说明pParent的右子树高,设pParent的右子树的根为pSubR当pSubR的平衡因子为1时,执行左单旋当pSubR的平衡因子为-1时,执行右左双旋2. pParent的平衡因子为-2,说明pParent的左子树高,设pParent的左子树的根为pSubL当pSubL的平衡因子为-1是,执行右单旋当pSubL的平衡因子为1时,执行左右双旋。原创 2024-07-20 21:20:39 · 482 阅读 · 0 评论 -
C++ set multiset map multimap用法
ser中插入的方法规则和搜索二叉树一样,大于key在右边,小于在左边。插入成功返回pair类型,里面第一个参数iterator 指向新插入节点 bool是true失败 参数iterator 指向已经存在的节点 bool是false。原创 2024-07-17 20:31:54 · 541 阅读 · 0 评论 -
二叉搜索树(相关函数实现)
二叉树_left,_value分别指向自己的左右孩子。根据_key大小判断新节点放到左边还是右边。_value非必须,用来存对应的相关信息。原创 2024-07-16 17:06:53 · 344 阅读 · 0 评论 -
C++ 多态
在继承中要构成多态还有两个条件:1. 必须通过父类的指针或者引用调用虚函数。2. 子类对虚函数进行重写。虚函数:即被virtual修饰的类成员函数称为虚函数。public:virtual void BuyTicket() { cout原创 2024-07-15 21:03:52 · 821 阅读 · 0 评论 -
C++中的继承
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类public://....// 子类 继承方式 父类public://...继承方式有三种 public protected private1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但无论是在类内还是类外都是不能访问的。(可以调用父类函数间接访问)原创 2024-07-13 12:56:10 · 631 阅读 · 0 评论 -
C++ 模板
那么怎么解决呢?原创 2024-06-07 12:30:00 · 2002 阅读 · 0 评论 -
C++ priority_queue 优先级队列
如果优先级队列中存入的是自定义类型,那应该怎么进行比较呢?这就需要我们在自定义类型的类中重载大于> 小于<。这样在less greater类的函数中就可以对><进行重载,实现大小的比较。int _month;int _day;但如果我要存入Date对象的地址呢?less greater类中函数直接比较的就是地址的大小。那我们可以新建一个类,先对地址解引用,在利用函数重载进行比较。原创 2024-06-04 14:30:00 · 888 阅读 · 0 评论 -
C++ deque 双端队列
1.push_back尾插。如果最后一段区间没满,直接插入就行。反之,就需要重新开辟一块空间,并在map中记录起始地址,再插入。2.push_front头插头插的话也要开辟一块空间,但数据的存入顺序是在这一段空间的末尾倒着存入。3.[]随机访问虽然deque的底层空间并不是完全连续的,但每次开辟的空间buff大小是确定的。对要访问的下标先除buff空间大小找到在第几个buff上,再取余找到在buff上的第几个元素。我们知道头插数据是倒着存入的,如果第一段空间没有满又改怎么办呢?原创 2024-06-02 20:48:46 · 1015 阅读 · 0 评论 -
C++ list用法
一.构造函数1.list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素2.list()构造空list3.list (const list& x)拷贝构造4.list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list迭代器不支持++=,支持++原创 2024-05-24 20:32:36 · 391 阅读 · 0 评论 -
C++ vector模拟实现
C++11会将 { } 括起来的内容识别为常量数组,然后构造成 initializer_list.initializer_list是一个特殊的模板类,用于表示一个初始化列表。当我们写完这两个构造函数,让我们来测试测试第一个构造函数。原创 2024-05-21 20:52:51 · 836 阅读 · 0 评论 -
C++ vector用法
其他实现功能和string差不多。原创 2024-05-18 12:00:00 · 450 阅读 · 0 评论 -
C++ string 模拟实现
如果每读入一个字符就+ 就会频繁扩容。我们可以借鉴内存池的思想,先把读入的字符存到buff数组中,满了就一次性加入str中。对于=符号重载实现我们也可以直接用传值传参的方式,string& operator=(string str);这里itorarter begin()能翻回第一个字符的位置就可以,itorater 怎么实现的无所谓。对于>>重载,实现先清除原有字符串,再用is.get()一个一个读入(可以对入空格 回车)追加字符时要考虑扩容的问题(先申请足够大的空间,再复制原数据。原创 2024-05-17 16:56:46 · 270 阅读 · 0 评论 -
C++ String函数用法
常用的只有 append(const char* s)提前扩容就可以减少扩容次数,提高效率。基本上可以代替上面两个的功能。原创 2024-05-06 20:25:46 · 2744 阅读 · 2 评论 -
C++模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。原创 2024-04-22 18:59:44 · 323 阅读 · 0 评论 -
C/C++内存管理 new和delete
1.new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构 造函数和析构函数对于自定义类型,malloc申请了空间但不能直接对类的成员变量初始化。而new可以自动调用默认构造,没有默认构造也可以显式传参进行构造。对于多参数的构造函数,我们需要把要传的参数用{}括起来。new原理1.调用operator new函数申请空间。2.调用构造函数,完成初始化。delete原理1.调用析构函数,完成对象中资源清理的工作。原创 2024-04-21 21:32:16 · 2075 阅读 · 0 评论 -
类和对象(初始化列表,static成员,友元,内部类)
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的 成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化(声明在类内,定义在类外,相当于函数声明定义分离)class Apublic:private://声明//定义//光有定义,没有声明会报错概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外 部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。原创 2024-04-17 22:41:01 · 810 阅读 · 0 评论 -
类和对象(构造函数,析构函数,拷贝构造函数,运算符重载)
构造函数是一个特殊的成员函数名字与类名相同创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。原创 2024-04-09 19:03:02 · 417 阅读 · 1 评论 -
类与对象(类,this指针)
关于类的定义,我们一般用class关键字来定义。class className//类的名字// 类体:由成员函数和成员变量组成// 一定要注意后面的分号//.hpublic://成员函数private://成员变量//.cppperror("malloc申请空间失败");return;_size = 0;我们可以看到 d1.Print() d2.Print(),明明调用的是同一个函数但打印结果是不一样的。C++编译器给每个“非静态的成员函数“增加了一个。原创 2024-04-06 19:54:27 · 1199 阅读 · 0 评论 -
类与对象( 命名空间,缺省参数,函数重载,引用,内敛,auto,范围for)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。namespace 命名空间名字....////命名空间可以含变量,函数,结构体int val;//命名空间可以嵌套//命名空间可以含变量,函数,结构体int val;//同一个工程中可以有同名的命名空间 编译器会合成在一起 (命名空间可以不连续)// 例如在 .h .cpp中有重名的命名空间会合在一起//test.h//test.cpp。原创 2024-03-29 17:26:36 · 929 阅读 · 0 评论