
C++语法与数据结构
文章平均质量分 92
学习C++语法与学习C++实现数据结构
Ragef
认真生活
展开
-
C++:智能指针
当构造智能指针对象时来一份资源就要new一个引用计数,多个shared_ptr指向资源时就++引用计数即可,当shared_ptr析构时只需要--引用计数,当引用计数--到0后代表当前析构的shared_ptr是最后一个管理资源的对象,则析构资源。是C++11设计出来的智能指针,翻译是弱指针,他不同于上面的智能指针,他不支持RAII,也就意味着不能用他来直接管理资源,weak_ptr的产生本质是要解决share_ptr的一个循环引用导致内存泄漏的问题。n1和n2析构后,管理两个节点的引用计数减到1。原创 2024-12-21 17:59:34 · 832 阅读 · 0 评论 -
C++:异常
首先检查throw本身是否在try块内部,如果在则查找匹配的catch语句,catch语句若不匹配或throw不在try块内部,则退出当前函数,继续在外层调用函数链中查找匹配的catch语句,上述查找catch语句的过程被称为栈展开。如果到main函数,异常仍然没有被匹配就会终止程序,不是发生严重错误的情况下我们是不希望程序终止的,所以main函数中最后都会使用catch(...),它可以捕获任意类型的异常,但是不知道异常的错误是什么。程序的执行会从throw的位置跳到与之匹配的catch模块。原创 2024-11-23 17:18:30 · 671 阅读 · 0 评论 -
C++:unordered_set、unordered_map类
unordered_set和unordered_map的底层是哈希桶实现的,使用方法和set/map都差不多所以它们的增删查平均效率是O(1)原创 2024-11-05 23:03:48 · 714 阅读 · 0 评论 -
C++:stack类(vector和list优缺点、deque)
stack类就是数据结构中的栈C数据结构:栈-优快云博客stack类所拥有的函数相比与string、vector和list类都少很多,这是因为栈这个数据结构是FIFO先进先出的,它必须被有所限制,所以所能用的函数只需要那几个足矣栈可以用顺序表来实现,也可以用链表来实现,我们只需要控制它先进先出的特性即可,用什么容器实现取决于个人因为我们前面实现了vector和list类,所以再实现stack类就容易很多了,只需要复用vector和list容器内的函数即可。原创 2024-08-17 18:10:11 · 995 阅读 · 0 评论 -
C++:string类(auto+范围for,typeid)
string是一个字符串类string类和数据结构中的顺序表非常相似,只要我们懂了顺序表那么string类也是手拿把掐了C数据结构:顺序表-优快云博客为什么要有string类?和我们平时使用的 "内容"有什么区别?string类有非常多的接口,比如size,substr等等,这些都可以直接的帮助我们完成所需对字符串的改变在学习STL模板之前,我们还需要了解两个前置知识。原创 2024-08-08 00:31:19 · 1002 阅读 · 0 评论 -
C++:list类(迭代器)
list是链表的意思它属于链表中的带头双向循环链表建议先掌握数据结构中的链表。原创 2024-08-14 21:25:53 · 896 阅读 · 0 评论 -
C++:queue类
queue类就是数据结构中的队列C数据结构:队列-优快云博客queue的性质还是FIFO先进先出queue类和stack类大的实现方式不一样,但是可以说是大差不差,都是复用其他容器来完成类C++:stack类(vector和list优缺点、deque)-优快云博客。原创 2024-08-18 21:37:40 · 484 阅读 · 0 评论 -
C++:多态(协变,override,final,纯虚函数抽象类,原理)
如果派生类继承后不重写虚函数,那么该派生类也是抽象类纯虚函数某种程度上强制了派生类重写虚函数,因为不重写就无法实例化出对象。原创 2024-09-21 23:31:06 · 899 阅读 · 0 评论 -
C++:哈希表
从发生冲突的位置开始,依次左右按二次方跳跃式探测,直到寻找到下一个没有存储数据的位置为止,如果从右走到哈希表尾,则回绕到哈希表头的位置,如果往左走到哈希表头,则回绕到哈希表尾的位置。哈希表里只需要存储一个指针,当没有数据映射这个位置时,指针为空,当有多个数据映射这个位置时,我们把这些冲突的数据链接成一个链表,挂在哈希表当前位置的下面。这是扩容的逻辑,因为哈希表为了减少哈希冲突,哈希表的容量需要尽可能的是素数,所以这里写了一个函数列了一个素数表来拿到下一个接近2倍并且是素数的值。原创 2024-11-01 00:22:45 · 901 阅读 · 0 评论 -
C++:模板 II(非类型模板参数,特化,分离编译)
这时候把p1和p2传进去比较的不是它指向的内容,而是比较的地址,所以这个比较是随机的也是错误的!顾名思义,它的类型形参并不是一个类型,就是用一个常量来作为类模板或函数模板的一个参数。这时候我们就可以让前面的Date*指针走我们特化的这个函数,结果就正确了。这个特化是特化为了指针,所以若是调用的指针类型就会调用到这个模板。4. 函数形参的类型必须要和特化的类型相同,如果不同编译器会报错。这个特化是特化为了引用,所以若是调用的引用类型就会调用到这个模板。3. 函数名后面跟一个,中指定需要特化的类型。原创 2024-08-21 22:32:16 · 865 阅读 · 0 评论 -
C++:vector类(default关键字,迭代器失效)
vector其实就是数据结构中的顺序表,建议先学会顺序表C数据结构:顺序表-优快云博客public:private:这个iterator其实本质就和上一节string类的iterator一致,只不过这里是T*C++:string类(auto+范围for,typeid)-优快云博客有iterator就顺带把const_iterator定义了,方便稍后实现const迭代器的函数既然有了迭代器,那么begin和end也就很容易实现出来了。原创 2024-08-14 01:31:10 · 932 阅读 · 0 评论 -
C++:继承(protected、隐藏、不能被继承的类、)
继承是面向对象语言程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类的特性基础上进行扩展,增加成员函数或者成员变量,这样产生新的类称为子类。3. 子类的operator=必须要调用父类的operator=完成父类的复制,需要注意的是它们两个构成隐藏关系,子类调用时需要指定父类作用域。当父类的构造函数私有时,子类的构成必须要调用父类的构造函数,但是私有化后,子类看不见,所以就不能调用了,子类就无法实例化出对象。继承⼀定程度破坏了父类的封装,父类的改变,对子类有很大的影响。原创 2024-08-22 23:47:16 · 1368 阅读 · 0 评论 -
C++11(右值引用、可变参数、lambda、包装器)
在C++98中我们可以使用{}对一般的数组和结构体初始化C++11以后想统一初始化方式,试图实现一切对象皆可用{}初始化,它也叫做列表初始化内置类型支持,自定义类型也支持,自定义类型的本质是类型转换,中间会产生临时对象,优化以后可以变成直接构造{}初始化的过程中,可以省略掉=原创 2024-11-14 23:34:22 · 934 阅读 · 0 评论 -
C++:二叉搜索树
二叉搜索树也叫二叉排序树之所以叫它搜索树是因为它本身搜索的速度快。原创 2024-09-26 18:39:44 · 1128 阅读 · 0 评论 -
C++:AVL树
AVL的本质就是一棵二叉搜索树,但是二叉搜索树若是高度不平衡,它的搜索速度就会大打折扣,AVL树就是优化的二叉搜索树,它能让整颗树的高度差不超过2,这样我们搜索起来的效率就是O(logN)新增节点后,影响到的是新增节点祖先节点的高度,所以我们更新平衡因子需要从parent节点开始持续往上更新调节,什么时候停止需要分情况讨论。当parent的平衡因子为-2,左子树的平衡因子为1,这时候单单的一次旋转是无法让这棵树平衡的。parent的平衡因子为-2,并且它的左节点的平衡因子为-1,则需要右单旋。原创 2024-10-07 23:11:24 · 1086 阅读 · 0 评论 -
C++:红黑树
红黑树也是一颗搜索二叉树,它每个节点的颜色不是红色就是黑色,所以叫做红黑树它可以确保没有一条路径比其他路径长出2倍,因此它接近平衡。原创 2024-10-15 23:40:05 · 908 阅读 · 0 评论 -
C++:priority_queue类
priority_queue类的本质是堆,下面是数据结构中的实现C数据结构:堆(实现、排序)-优快云博客它的实现也是和前面的栈和堆类似,一样用其他容器的成员函数来实现。原创 2024-08-20 23:42:31 · 466 阅读 · 0 评论 -
C++:map和set类
string、vector、list、deque、array、forward_list,这些容器统称为序列式容器这些容器存储之间的值一般没有紧密的关联关系,比如交换一下,它依然是序列式容器map、set这些系列的就是关联式容器,两个位置有紧密的关联关系,交换一下它的结构就被破坏了map和set的底层是红黑树set是key搜索场景的结构map是key/value搜索场景的结构。原创 2024-10-25 23:45:20 · 382 阅读 · 0 评论