C++ 提高编程

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 普通函数和函数模板的调用规则

调用规则如下

  1. 如果函数模板和普通函数都可以实现,优先调用普通函数
  2. 可以通过空模板参数列表强制调用函数模板


|  | 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); // 空模板参数列表调用模板函数 |
|  | } |


  1. 函数模板也可以发生重载
  2. 如果函数模板可以产生更好的匹配模式,优先调用函数模板


|  | 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 类模板和函数模板的区别

类模板与函数模板区别主要有两点

  1. 类模板没有自动类型推导的使用方式
  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 使用时机

类模板中成员函数和普通类中成员函数创建时机是有区别的

  • 普通类中的成员函数一开始就可以创建
  • 类模板中的成员函数在调用时才创建
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[虚幻私塾】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值