Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
目录* C++ 提高编程
+ 一、 模板
- 1、 概念
- 2、 函数模板
* 2.1 函数模板语法
* 2.2 注意事项
* 2.3 普通函数和函数模板的区别
* 2.4 普通函数和函数模板的调用规则
* 2.5 模板的局限性
- 3、 类模板
* 3.1 类模板语法
* 3.2 类模板和函数模板的区别
* 3.3 使用时机
* 3.4 类模板对象函数做参数
* 3.5 类模板与继承
* 3.6 类模板成员函数类外实现
* 3.7 类模板文件编写
* 3.8 类模板和友元
* 3.9 数组类封装
+ 二、 STL 初识
- 1、 基本概念
- 2、 STL 六大组件
* 2.1 容器、算法、迭代器
- 3、 迭代器初始
* 3.1 vector 存放内置数据类型
* 3.2 vector 存放自定义数据类型
* 3.3 vector 中嵌套容器
+ 三、 STL 常用容器
- 1、 string 容器
* 1.1 string 基本概念
* 1.2 string 构造函数
* 1.3 string 赋值操作
* 1.4 string 字符串拼接
* 1.5 string 查找和替换
* 1.6 string 字符串比较
* 1.7 string 字符存取
* 1.8 string 插入和删除
* 1.9 string 中的子串
- 2、 vector 容器
* 2.1 vector 基本概念
* 2.2 vector 构造函数
* 2.3 vector 赋值操作
* 2.4 vector 大小操作
* 2.5 vector 插入和删除
* 2.6 vector 数据存取
* 2.7 vector 互换容器
* 2.8 vector 预留空间
- 3、 deque 容器
* 3.1 deque 基本概念
* 3.2 deque 构造函数
* 3.3 deque 赋值操作
* 3.4 deque 大小操作
* 3.5 deque 插入和删除
* 3.6 deque 数据存取
* 3.7 deque 排序
- 4、 案例-评委打分
* 4.1 案例描述
* 4.2 实现步骤
- 5、 stack 容器
* 5.1 stack 基本概念
* 5.2 stack 常用接口
+ 5.2.1 构造函数
+ 5.2.2 赋值操作
+ 5.2.3 大小操作
+ 5.2.4 数据存取
- 6、 queue 容器
* 6.1 queue 基本概念
* 6.2 queue 常用接口
+ 6.2.1 构造函数
+ 6.2.2 赋值操作
+ 6.2.3 大小操作
+ 6.2.4 数据存取
- 7、 list 容器
* 7.1 list 基本概念
* 7.2 list 构造函数
* 7.3 list 赋值和交换
* 7.4 list 大小操作
* 7.5 list 插入和删除
* 7.6 list 数据存取
* 7.7 list 反转和排序
- 8、 set / multiset 容器
* 8.1 set 基本概念
* 8.2 set 构造和赋值
* 8.3 set 大小和交换
* 8.4 set 插入合删除
* 8.5 set 查找和统计
* 8.6 set 和 multiset 区别
* 8.7 pair 对组创建
* 8.8 set 排序
- 9、 map / multimap 容器
* 9.1 map 基本概念
* 9.2 map 构造和赋值
* 9.3 map 大小和交换
* 9.4 map 插入和删除
* 9.5 map 查找和统计
* 9.6 map 排序
- 10、 案例-员工分组
* 10.1 案例描述
* 10.2 实现步骤
* 10.3 代码演示
+ 四、 STL 函数对象
- 1、 函数对象
* 1.1 基本概念
* 1.2 使用方法
- 2、 谓词
* 2.1 谓词概念
* 2.2 一元谓词
* 2.3 二元谓词
- 3、 内建函数对象
* 3.1 意义
* 3.2 算术仿函数
* 3.3 关系仿函数
* 3.4 逻辑仿函数
+ 五、 STL 常用算法
- 1、 常用遍历算法
* 1.1 for_each
* 1.2 transform
- 2、 常用查找算法
* 2.1 find
* 2.2 find_if
* 2.3 adjacent_find
* 2.4 binary_search
* 2.5 count
* 2.6 count_if
- 3、 常用排序算法
* 3.1 sort
* 3.2 random_shuffle
* 3.3 merge
* 3.4 reverse
- 4、 常用拷贝和替换算法
* 4.1 copy
* 4.2 replace
* 4.3 replace_if
* 4.4 swap
- 5、 常用算术生成算法
* 5.1 accumulate
* 5.2 fill
- 6、 常用集合算法
* 6.1 set_insersection
* 6.2 set_union
* 6.3 set_difference
C++ 提高编程
主要针对C++泛型编程和STL技术
一、 模板
1、 概念
模板就是建立通用的模具,大大提高代码的复用性
模板特点
- 模板不可以直接使用,它只是一个框架
- 模板的通用并不是万能的
2、 函数模板
- C++ 另一种编程思想为泛型编程,主要利用的技术就是模板
- C++ 提供两种模板机制:函数模板 和 类模板
2.1 函数模板语法
函数模板的作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体确定,用一个虚拟的类型来代表
语法
| | template |
| | 函数声明或定义 |
参数
- template:声明创建模板
- typename:表明其后面的符号是一种数据类型,可以用class来代替
- T:通用的数据类型,名称可以替换,通常为大写字母
| | // 两个整型交换函数 |
| | void swap(int& a, int& b) |
| | { |
| | int temp = a; |
| | a = b; |
| | b = temp; |
| | } |
| | // 交换浮点型的函数 |
| | void swap(double& a, double& b) |
| | { |
| | double temp = a; |
| | a = b; |
| | b = temp; |
| | } |
| | // 函数模板 |
| | template // 声明模板,告诉编译器后面代码紧跟着T,不要报错,T是一个通用的数据类型 |
| | void m\_swap(T& a, T& b) |
| | { |
| | T temp = a; |
| | a = b; |
| | b = temp; |
| | } |
| | void test() |
| | { |
| | int a = 1; |
| | int b = 3; |
| | double a1 = 4; |
| | double b1 = 5; |
| | /* swap(a, b); |
| | cout << a << b << endl; |
| | swap(a1, b1); |
| | cout << a1 << b1 << endl; */ |
| | // 使用函数模板 |
| | // 1、 自动推导 |
| | m\_swap(a, b); |
| | cout << a << b << endl; |
| | // 2、 显示指定类型 |
| | m\_swap<int>(a, b); |
| | cout << a << b << endl; |
| | } |
模板可以将数据类型参数化
模板的使用方法
- 自动推导
- 显示指定类型
2.2 注意事项
注意事项
- 自动推导数据类型,必须推导出一致的数据类型 T,才可以使用
- 模板必须要确定出 T 的数据类型,才可以使用
2.3 普通函数和函数模板的区别
- 普通函数调用时可以发生自动类型转换(隐式类型装换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型装换
- 如果利用显示指定类型的方法,可以发生隐式类型转换
2.4 普通函数和函数模板的调用规则
调用规则如下
- 如果函数模板和普通函数都可以实现,优先调用普通函数
- 可以通过空模板参数列表强制调用函数模板
| | void myPrint(int a, int b) |
| | { |
| | cout << a << b << endl; |
| | cout << "普通函数" << endl; |
| | } |
| | template |
| | void myPrint(T a, T b) |
| | { |
| | cout << a << b << endl; |
| | cout << "模板函数" << endl; |
| | } |
| | |
| | void test() |
| | { |
| | int a = 10; |
| | int b = 20; |
| | myPrint<>(a, b); // 空模板参数列表调用模板函数 |
| | } |
- 函数模板也可以发生重载
- 如果函数模板可以产生更好的匹配模式,优先调用函数模板
| | void myPrint(int a, int b) |
| | { |
| | cout << a << b << endl; |
| | cout << "普通函数" << endl; |
| | } |
| | template |
| | void myPrint(T a, T b) |
| | { |
| | cout << a << b << endl; |
| | cout << "模板函数" << endl; |
| | } |
| | |
| | void test() |
| | { |
| | char a = 'a'; |
| | char b = 'b'; |
| | myPrint(a, b); // 函数模板可以产生更好的匹配 |
| | } |
既然提供了函数模板,最好不要提供普通函数,否则容易出现二义性
2.5 模板的局限性
- 模板的通用性并不是万能的
如果传入的是一个元组以及自定义数据类型,就无法实现了
因此,C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化模板
| | // 模板重载 |
| | // 对比两个数据是否相等 |
| | class Person |
| | { |
| | public: |
| | Person(string name, int age) |
| | { |
| | m\_Age = age; |
| | m\_Name = name; |
| | } |
| | string m\_Name; |
| | int m\_Age; |
| | }; |
| | template |
| | bool myCompare(T& a, T& b) // 如果传入的是一个自定义数据类型呢 |
| | { |
| | if (a == b) |
| | { |
| | return true; |
| | } |
| | else |
| | { |
| | return false; |
| | } |
| | } |
| | // 利用具体化Person的版本实现代码,具体化优先调用 |
| | // 也可以使用运算符重载 |
| | template<>bool myCompare(Person& p1, Person& p2) |
| | { |
| | if (p1.m\_Name == p2.m\_Name && p1.m\_Age == p2.m\_Age) |
| | { |
| | return true; |
| | } |
| | else |
| | { |
| | return false; |
| | } |
| | } |
| | void test() |
| | { |
| | Person p1("Tom", 10); |
| | Person p2("Tom", 10); |
| | cout << myCompare(p1, p2) << endl; |
| | } |
学习模板并不是为了写模板,而是在STL中能够运用系统提供的模板
3、 类模板
3.1 类模板语法
类模板作用
- 建立一个通用类,类中成员数据类型可以不具体制定,用一个虚拟的类型代表
语法
| | template |
| | 类 |
参数
- template:声明创建模板
- typename:表明其后面的符号是一种数据类型,可以用class来代替
- T:通用的数据类型,名称可以替换,通常为大写字母
| | template |
| | class Person |
| | { |
| | public: |
| | Person(NameT name, AgeT age) |
| | { |
| | m\_Age = age; |
| | m\_Name = name; |
| | } |
| | NameT m\_Name; |
| | AgeT m\_Age; |
| | }; |
| | void test() |
| | { |
| | Person<string, int>("Tom", 30); // 调用-只有一种调用方式 |
| | } |
3.2 类模板和函数模板的区别
类模板与函数模板区别主要有两点
- 类模板没有自动类型推导的使用方式
- 类模板在模板参数列表中可以有默认参数
| | templateint> // 默认参数 |
| | class Person |
| | { |
| | public: |
| | Person(NameT name, AgeT age) |
| | { |
| | m\_Age = age; |
| | m\_Name = name; |
| | } |
| | NameT m\_Name; |
| | AgeT m\_Age; |
| | }; |
| | void test() |
| | { |
| | Person<string>("Tom", 30); |
| | } |
3.3 使用时机
类模板中成员函数和普通类中成员函数创建时机是有区别的
- 普通类中的成员函数一开始就可以创建
- 类模板中的成员函数在调用时才创建