C++缝隙间的重构史诗:异常
通过合理的异常处理机制,程序可以在遇到异常情况时,避免直接崩溃,而是采取合适的措施,如提示用户错误信息、进行数据回滚、尝试重新执行操作等,从而增强程序的健壮性和稳定性 为什么要有异常处理机制?🚩传统的错误处理机制: 终止程序,如 assert,缺陷:用户难以接受。如发生内存错误,除 0 错误时就会终止程序 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到 errno 中,表示错误 实际中 C 语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误,因此通过异常机制来实现错误的查找回滚修改是很有必要的 异常的抛出捕获机制1234567891011121314151617181920212223242526272829303132double Division(int a, int b){ // 当b == 0时抛出异常 if (b == 0) throw "Division by zero condition!"; else return ((double)a /...
C++漫溯键值的长河:map && set
迄今为止,除了二叉搜索树以外的结构,我们学习到的顺序表,链表,栈和队列等都属于这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身 关联式容器 根据应用场景的不同,STL 总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高 键对值中的 key 表示键值,value 表示与 key 对应的信息 SGI-STL中关于键值对的定义: 12345678910111213template <class T1, class T2>struct pair{ typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() :...
C++穿梭树影间的智慧博弈:二叉搜索树OJ
本篇对搜索二叉树常见的面试OJ进行了总结,方便对常见的数据结构使用方法进行总结 根据二叉树创建字符串✏️题目描述: ✏️示例: 传送门: 根据二叉树创建字符串 题解: 观察示例可以知道,无论是左为空还是左为不为空,都要添加括号,所以直接递归下去,右分支则可以根据情况省略括号 💻代码实现: 1234567891011121314151617181920212223242526272829class Solution {public: string tree2str(TreeNode* root) { if (root == nullptr) { return " "; } string str = to_string(root->val); if (root->left || root->right) { str +=...
C++镌刻数据密码的树之铭文:二叉搜索树
继数据结构的二叉树学习,本篇进行更进一步的搜索二叉树,是一种更为常见的结构 二叉搜索树的概念 二叉搜索树简单来说就是一个排序树 它是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 🔥值得注意的是: 每棵子树都满足该性质 二叉搜索树的实现二叉搜索树的结构12345678910111213template<class K>struct BSTreeNode{ BSTreeNode<K>* _left; BSTreeNode<K>* _right; K _key; BSTreeNode(const K& key) :_left(nullptr) ,_right(nullptr) ,_key(key) { }}; _left: 指向左子节点的指针。 _right: 指向右子节点的指针。 _key:...
C++程序诗篇的灵动赋形:多态
本篇将开启 C++ 三大特性中的多态篇章,多态允许你以统一的方式处理不同类型的对象,通过相同的接口来调用不同的实现方法。这意味着你可以编写通用的代码,而这些代码可以在运行时根据对象的实际类型来执行特定的操作 什么是多态? 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态 ✏️举个例子: 比如买高铁票的时候,我们都属于 Person 类,买的时候会显示为全价,那么我们又属于 Student 类,继承于 Person 类,这时买的时候又会显示为半价,假设两个类都有 BuyTicket 函数,那么相同的函数在继承的基础上,能够实现不同的功能,这就是多态 多态的语法实现虚函数12345678class Person {public: virtual void BuyTicket() { cout << "买票-全价" << endl; }}; 被 virtual 修饰的类成员函数称为虚函数,注意这里和菱形虚拟继承的 virtual...
C++类间的 “接力棒“ 传递:继承(下)
本篇接着补充继承方面的内容,同时本篇的菱形继承尤为重要 继承与友元123456789101112131415161718192021222324252627class Student;class Person{public: friend void Display(const Person& p, const Student& s);protected: string _name;};class Student : public Person{protected: int _stuNum;};void Display(const Person& p, const Student& s){ cout << p._name << endl; cout << s._stuNum << endl;}void main(){ Person p; Student s; Display(p,...
C++类间的 “接力棒“ 传递:继承(上)
本篇将开启 C++ 三大特性中的继承篇章,继承是一种派生类能够复用基类的代码,同时还能添加自己特有的属性和方法,或者对基类的方法进行重写。这种机制可以提高代码的复用性和可维护性 什么是继承?继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用 ✏️举个例子: 学生和老师都有的共同点(Person): 年龄,性别,名字等 学生特有的(Student): 学号,专业,宿舍号 老师特有的(Teacher): 职工号,职称 共同点就相当于一个基底,称他为基类或者父类,在基类的基础上拓展出来的各种各样的角色称他为派生类或者子类,这样一个拓展的过程就叫继承,所以继承的本质是一种复用 继承的语法Person 是父类,也称作基类。Student 是子类,也称作派生类 其语法为: 表示 Student 是 public 继承于...
C++底层学习精进:模板进阶
本篇是对模板初阶的补充说明 非类型模板参数在模板初阶部分就介绍过类型形参 即出现在模板参数列表中,跟在 class 或者 typename 之类的参数类型名称 🔥值得注意的是: 这里进行一点之前的补充,在模板初阶部分我们对 class 和typename 进行了介绍,一般这两个参数类型是可以互相替换的,没啥区别,但是有一个特殊情况: 1234567891011template<class Container>void Print(const Container& v){ Container::const_iterator it = v.begin(); while (it != v.end()) { cout << *it << " "; it++; } cout << endl;} 当我们用模板参数来写 vector 数组的遍历的时候,Container::const_iterator 包含模板参数没有实例化,编译器无法确定 const_iterator...
C++效率掌握之STL库:优先级队列priority_queue && 双端队列deque
本篇是 STL 库专题之 priority_queue 和 deque,书接上文 priority_queue priority_queue 的主要特征可总结为: 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的,简单来说就是取出元素的顺序默认是从大到小的 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素) 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作: empty():检测容器是否为空 size():返回容器中有效元素个数 front():返回容器中第一个元素的引用 push_back():在容器尾部插入元素 pop_back():删除容器尾部元素 标准容器类 vector 和 deque...
C++效率掌握之STL库:stack && queue函数全解
本篇是 STL 库专题之 stack 和 queue,本质就是栈和队列,关于该数据结构在初阶数据结构专栏里有详细的解释分析,本篇文章主要针对 stack 和 queue 的使用及拓展进行练习和介绍,建议熟悉好相关的数据结构知识再进行本篇学习 传送门:【初阶数据结构】先来后到的秩序:栈和队列 stack stack 的主要特征可总结为: stack 是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作 stack 是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出 stack 的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作: empty:判空操作 back:获取尾部元素操作 push_back:尾部插入元素操作 pop_back:尾部删除元素操作 标准容器 vector、deque、list 均符合这些需求,默认情况下,如果没有为 stack...