- 博客(89)
- 收藏
- 关注
原创 【C++ OJ练习】6.验证回文串
字符的话 说明不是回文串 就这样一直往下走 直到最后两下标相遇 那么就是回文串 注意双循环条件。字母全部要变成小写 并且不能管空格和标点 这样从前和后分别遍历并进行比较 如果遇到不是相同。
2023-07-11 09:00:00
233
原创 【C++ OJ练习】1.求和
利用C++构造函数的特性 既然不能使用循环 那么我们可以定义n个对象 就会调用n次构造函数。去代替循环 每次调用的时候进行加法的计算。
2023-07-06 09:00:00
220
原创 【C++】23.C++的IO流(补)
C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。在使用时候必须要包含文件并引入std标准命名空间。
2023-05-29 09:00:00
843
原创 【C++】22.单例模式+类型转换
总结对比一下饿汉和懒汉的区别懒汉模式需要考虑线程安全和释放的问题 实现相对复杂 饿汉模式不存在以上问题 实现简单懒汉是一种懒加载模式 需要时再初始化对象 不会影响程序的启动 饿汉模式则相反 程序启动阶段就创建初始化实例对象 会导致程序启动慢 影响体验如果有多个单例类 假设有依赖关系(B依赖A) 要求A单例先创建初始化 B再启动 那么就不能用饿汉 因为无法保证初始化顺序 这个用懒汉我们就可以手动控制总结一下:实际中懒汉模式还是更实用一些。
2023-05-19 09:00:00
321
原创 【C++】20.异常
传统的处理错误的缺陷:a.拿到错误码 需要查找错误码表 才知道是什么错误b.如果一个函数使用过返回值拿数据 发生错误时很难处理c.如果调用的函数栈很深 一层层返回错误码 整个处理很难受。
2023-05-16 09:00:00
243
原创 【C++】19.C++11
右值引用作参数和作返回值减少拷贝的本质是移动构造和移动赋值左值引用和右值引用本质的作用都是减少拷贝右值引用本质可以认为是弥补左值引用不足的地方相辅相成 都是减少拷贝左值引用:解决的时传参过程中和返回值过程中的拷贝作参数:void f1(T x) -> void f1(T& x) 解决的是传参过程中减少拷贝作返回值:T f2() -> T& f2() 解决的返回值过程中的拷贝 但是无法解决接收返回值时的拷贝 比如T ret = f2();但是要注意这里有限制。
2023-05-15 09:00:00
669
原创 【C++】18.哈希
哈希(散列):将存储的数据根存储的位置使用哈希函数建立出映射关系 方便我们进行高效查找哈希冲突:不同的值映射到了相同的位置解决哈希冲突:1.闭散列-开放定制法(我的位置被占了 我就去占别的位置--不推荐)2.开散列-拉链法(冲突的数据链式结构挂起来--推荐)查找的时间复杂度O(1)假设总是有一些桶挂的数据很多 冲突很厉害如何解决?1°一个链的长度超过一定值 就将挂链表改成挂红黑树(Java HashMap就是这样解决的 当桶长度超过8就改成挂红黑树)2°控制负载因子。
2023-04-28 09:00:00
490
原创 【C++】17.map和set的模拟实现
operator++是关键 迭代需要走中序 如何走中序?_node从左子树的最左结点开始遍历走中序分两类情况:如果右树不为空 那么中序的下一个就是右子树的最左结点如果右树为空 那么表示_node所在的子树已经完成 在一个结点的祖先去找沿着路径往上孩子是它的左的那个祖先整颗红黑树。
2023-04-15 09:00:00
411
原创 【C++】16.红黑树
红黑树,是一种,但在,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
2023-04-13 09:00:00
407
原创 【C++】15.AVL树
还会涉及到parent上面的祖先需不需要变化 我们一步步来。第一步已经在上篇博客实现 难度在第二步。非常复杂 需要进行旋转。
2023-04-03 09:00:00
233
原创 【C++】14.二叉搜索树
有两种情况:一棵空树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。
2023-03-31 09:00:00
134
原创 【C++】13.多态
必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写重载:1.两个函数在同一作用域2.函数名相同 参数不同重写:1.两个函数分别在父类和子类的作用域2.函数名/参数/返回值都必须相同(协变例外)3.两个函数都必须是虚函数重定义(隐藏)1.两个函数分别在父类和子类的作用域2.函数名相同3.两个父类和子类的同名函数不构成重写就是重定义。
2023-03-18 09:00:00
276
原创 【C++】12.继承
class Student(派生类):public(继承方式) Person(基类){};多继承是C++的缺陷之一,Java设计的时候避开了多继承继承与组合//继承class A{};{};//组合class C{};class DC c;继承是一种白箱(看得见)复用 父类对子类基本是透明的 但是一定程度破坏了父类的封装组合是一种黑箱(看不见)复用 C对D是不透明的 C保持着封装对比认为组合是更好的组合的类耦合度更低继承的类是一种高耦合面试:用组合还是继承?
2023-03-17 09:00:00
373
原创 【C++】11.模板进阶
模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2023-03-16 09:00:00
337
原创 【C++】10.stack和queue
容器:string/vector/list/deque(序列式容器)适配器:stack/queue/priority_queue迭代器:iterator/const_iterator/reverse_iterator/const_reverse_iterator算法:sort/find/reverse仿函数:less/greaterdeque的缺点:大量的频繁opeartor[]的效率低迭代器的遍历相对复杂 效率也有一些影响vector缺点:头插头删的效率低 空间不够用了增容代价大。
2023-03-15 09:00:00
300
原创 【C++】9.list
vector:顺序表list:链表为什么会有list?补充vector的缺点存在的vector缺点:1.头部和中部的插入删除效率低 O(N) 因为需要挪动数据2.插入数据空间不够需要增容 增容需要开新空间 拷贝数据 释放旧空间 会付出很大代价优点:1.支持下标的随机访问 间接的就很好的支持排序 二分查找 堆算法list就是为了解决vector的缺陷优点:1.list头部 中间插入不再需要挪动数据 效率高 O(1)2.list插入数据是新增节点 不需要增容缺点:1.不支持随机访问。
2023-03-14 09:00:00
261
原创 【C++】8.vector
第二种:直接进行交换 包含三个指针的交换 写一个命名空间的swap 利用std的swap进行。需要加返回值 不加就有可能跳过偶数 加了就可以从删的下一个开始遍历 不会有漏数据的。不然删除的时候 可能会漏掉数据 因为返回的下一个位置不会被再次检测 写了返回类。拷贝的 一个一个字节进行拷贝 浅拷贝 所以要用for循环进行一个个的拷贝。因为迭代器it没有动 还是在旧空间 所以无法进行迭代器的遍历。步骤:开新空间 拷贝数据 释放旧空间 然后指针指向新空间。第一种:释放旧空间 开新空间 memcpy拷贝数据。
2023-03-13 09:00:00
191
原创 【C++】7.string
如果从w位置开始删 erase(,2) erase(,5) erase(,8) erase(,string::npos)"hello\0" resize(8) 后面三个添字符 resize(18) 需要先扩容 resize(2) 删。因此要强转 利用strncpy进行直接的追加 可以直接把\0拷贝过来 STL库里面是返回*this的。注意字符串的插入时的一些细节 pos为0的时候 end会转换 -1的无符号变为最大数。编译器默认的拷贝构造是浅拷贝 也就是说两个hello的地址是一样的。
2023-03-10 09:00:00
337
原创 【C++】5.C/C++内存管理
new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
2023-02-26 09:00:00
447
原创 【C++】3.类和对象(中)
调用默认构造函数:1.无参 2.全缺省 3.编译器自动生成的特点:不用传参 三个只能有一个无参初始化和全缺省不能同时存在 调用时会有歧义无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。成员变量的命名风格 有_ 初始化时year = year就很傻 需要区分我们会自己实现构造函数 那么编译器的构造函数是不是没有用?有用 存在即合理。
2023-02-23 09:00:00
334
原创 【C++】2.类和对象(上)
int _age;{}class为定义类的关键字Person为类的名字{}为类的主体最后要有分号类中的元素称为类的成员类中的数据称为类的属性或者成员变量类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。声明放在.h文件中,类的定义放在.cpp文件中第二种方式引入.h文件后可以写相关成员函数 加上类名:: 表示是这个类中的函数。
2023-02-21 09:00:00
368
原创 【C++】1.C++基础
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。普通的命名空间int a;命名空间可以嵌套int a;int b;int c;int d;同一个工程中允许存在多个相同名称的命名空间编译器最后会合成同一个命名空间中(可以写两个N1)C++11:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。使用auto定义变量时必须对其进行初始化。
2023-02-20 09:00:00
426
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人