分类: [科锐]

43_迭代器、栈、队列

迭代抽象 表示某个数据 数据成员:元素指针 成员函数:下一个(++),获取数据(*),逻辑运算(!= == )等等 const迭代器一般只能遍历,不提供修改。 模板带有作用域定义声明一起实现 解决了节点的安全隐患 链表时间复杂度 插入O(1) 删除O(1) 查询O(n) 随机访问O(n) 使用场合 插入和删除频繁的场景 游戏里面的场景,怪物刷新和死亡 栈和队列 栈先进后出,后进先出 队列是先进先出,后进后出 栈 一般用单向链表来做 栈一般提供迭代器 队列 一般提供单向链表来做 使用数组存放栈和队列的时候 提前知道空间多大的时候 作业 1. ......

42_移动构造

移动构造 1.区分深拷贝和浅拷贝,C11添加了移动构造函数 ClassName(const ClassName& obj)拷贝构造 ClassName(ClassName&& obj)移动构造函数 右值引用 std::move,匹配移动构造,也可以强转类名加两个引用 std::swap,交换 2.解决链表匿名对象new和delete问题,移动构造设置大小为0,不会被重复释放 3.常量自动匹配右值引用 作业 1.动态数组模板(移动构造) 2.链表模板(移动构造) //Vector.h #pragma once template class CVector { public: CVector(const unsigned initCapacity = 1U) //默认构造 ......

41_链表

作用 元素不是连续存放的 解决方式:知道前后位置存放的位置 链式存储:插入和删除快,也叫链表 List 单向链表(早期内存不够的情况下) 前面放数据,后面放后继,用结构体取名为节点,没有前驱 头节点,存放链表的起始位置,如果不存放头指针,每次插入删除需要判断头节点与尾节点。效率更高 带头尾单链表 Head data1 next data2 next data3 next data4 next tail 不带头尾单链表 data1 next data2 next data3 next null(标记结束) 静态链表 有头尾节点,有前驱后继,使用动态数组存储 循环链表 有头尾节点, ......

40_线性表、向量

线性表的定义 线性表的逻辑结构 由n(n>=0)个数据元素(a1,a2,…,an)构成的有限序列。记作L=(a1,a2,…an)A1—-首元素,An尾元素 表的长度 空表 线性表的特征 直接前驱(prev) 直接后继(next) 允许没有前驱与后继,仅限于头尾 抽象数据类型线性表的定义 ADT list { //增删改查、清空、前驱、后继、线性表的长度、取元素、合并、复制 } 线性表的顺序表示(顺序存储结构) 顺序分配—将线性表中的数据元素依次存放到计算机存储器中一组地址连续的存储单元中,这种分配方式称为顺序分配或顺序映像。得到:顺序存储结 ......

39_数据结构概念

数据结构 书推荐:数据结构与算法分析,黄色,标头带走美字 什么是数据:输入到计算机中并被计算机加工、处理的符号的总称 什么是数据元素:数据的基本的单元,在计算机程序中通常作为一个整体进行考虑和处理(结构体名称) 什么是数据项:是数据不可分割的最小单位,一个数据元素可由一个或者多个数据项组成(结构体数据成员) 什么是数据对象:由性质相同的数据元素组成的集合。数据对象是数据的一个子集。(结构体数组) 什么是抽象数据对象:某种同类型的数据元素(模板) 什么是数据结构:相互之间存在一种或多种特定关系的数据元素的集合。 ......

38_异常

异常 作用 错误处理方式,简化处理错误的代码 让函数调用者知道会出现错误 深入 C库 printf 函数使用者和函数实现者非同一人 如果有一个除法函数,使用者调用4,0程序崩了 函数实现者知道错误,但是不知道如何处理 函数使用者知道怎么处理,但是不知道什么时候错误 Int g_error = 0; Int myDiv(int num1, int num2) { If(num2 == 0) { g_error = -1; Return g_error; } If(g_error != -1) { g_error = 0; Return num1 / num2; } 语法 抛异常 效果 如果不处理,默认调用abort()函数,弹出警告,没人处理这个错误 Catch类型强 ......

37_iostream流

stream流:著名的设计 抽象成输出流和输入流,通用的操作方法 Ostream:输出流 Istream:输入流 ofstream:文件输出流,头文件<fstream> 文本方式 ofsteam of; of.open(“1.txt”, ios::out); of << “text” << endl;’ of << 3.5 << endl; of.flush(); //刷新 of << flush; //刷新 of.close(); //关闭 二进制方式 ofsteam of(“1.txt”, ios::out | ios:binary); of.write(“hello”, 6); int n = 0x1234567; of.write((char*)&n, sizeof(n)); of.bad(); //是否失败 of.good(); //判断是否成功, ......

36_泛型编程与模板

泛型编程 作用:某些算法跟类型没关系,代码逻辑一样,就数据类型不一样 模板 作用 让编译器自动写函数 实现 类型参数化,调用函数的时候声明传入的类型。Add<TYPE>(1, 2) 语法 1.单个模板参数 template<class TYPE> TYPE add(TYPE value1, TYPE value2) { Return value1 + value2; } 2.多个模板参数 Template<typename t1, typename t2, typename t3> T3 del(t1 value1, t2 value2) { Return value1 – value2; } 注意 没有实例化模板的时候不参与编译 同类型模板只实例化一次 写模板的时候记得先实例化测试 ......

35_运算符重载与智能指针

作业讲解 析构地址不同有多个的原因,一个delete调用会free空间,一个就是析构 运算符重载 只有类才有运算符重载 简化方法,如设置值可以直接使用等于号赋值 目标:代码简洁 功能:重载已有运算符赋予新的功能 语法 Class A { Public: Void operator= (int n) { m_iX = n; } Private: int m_iX; }; 全局函数重载运算符 需要使用friend联合使用 转换运算符 语法Operator TYPE 转换运算符重载,使用的时候需要重载 运算符重载优先级大于转换运算符 垃圾回收:自动delete,智能指针设计 使用一个类有这个类的数 ......

34_override、final、内存结构、名称粉碎

Override、final 概念 重载:同名作用域相同 隐藏:同名作用域不同,继承 覆盖:派生类重写了基类的虚表,override声明构成覆盖 final写在类名后表示不能被继承 //class X final Class A { Public: Void fun1() { } Void fun1(int) { } Virtual void fun2() final //加上final不让派生类覆盖 { } } Class B : public A { Public: Void fun1() { } Virtual void fun2(int) { } Virtual void fun2() { } } 内存结构 单独一个类 单独一个类有虚函数 单重继承 单重继承有虚函数 单重虚继承 0 ......