
一、模板模板C的编译期代码生成机制通过参数化类型实现泛型编程允许编写与类型无关的通用代码。模板的特点泛型编程和模板机制泛型编程一种以类型参数化为核心的编程范式通过模板机制编写与具体数据类型无关的通用算法和数据结构实现代码复用且不牺牲运行时性能。1、函数模板函数模板C中用于生成重载函数的编译期蓝图通过参数化类型让同一算法适用于不同数据类型在调用时根据实参自动推导或显式实例化具体函数版本。函数模板的语法总结注意事项①自动类型推导必须推导出一致的数据类型T才可以使用。template typename TYPE void my_swap(TYPE a, TYPE b) { TYPE num; num a; a b; b num; } int main() { int a 1; double c 3.1; my_swap(a, c); // ❌ a是int类型c是double类型不可以使用模板。 system(pause); return 0; }②模板必须要确定T的数据类型才可以使用。template typename TYPE void fun() { cout fun()函数调用 endl; } int main() { fun(); // ❌ TYPE类型未确定不可以使用模板。 funint(); // ✅ TYPE类型是intTYPE类型确定了可以使用模板。 system(pause); return 0; }2、函数模板的案例案例描述3、普通函数和函数模版的区别如果函数模板的参数是引用也不会发生隐式转换因为引用不允许改变它的指向也就是引用绑定的对象不能变。总结4、普通函数和函数模版的调用规则调用规则1普通函数和函数模板都可以实现优先调用普通函数。注意⚠️在普通函数和函数模板都可以实现的时候如果普通函数只有声明没有定义那么调用函数时并不是调用函数模板还是按照优先调用普通函数的规则又因为普通函数没有实现直接报错误信息。2通过空模板参数列表可以强制调用函数模板。3函数模板也可以重载。4函数模板可以更好的匹配优先调用函数模板。总结5、模板的局限性局限性模板不是万能的有些特定的数据类型需要具体化方式进行特殊的实现。总结6、类模板类模板一种代码蓝图允许你定义一个通用类其中数据类型作为参数在实例化时再指定具体类型如vectorint语法总结7、类模板与函数模板的区别1类模板不可以自动类型推导2类模板的参数列表可以有默认参数8、类模板中成员函数的创建时机类模板成员函数未调用不创建类模板成员函数调用时创建9、类模板对象做函数参数类模板对象传参的方式1指定传入的类型直接显示对象的数据类型2参数模板化对象中的参数变为模板进行传递3整个类模板化对象类型模板化进行传递总结10、类模板与继承指定具体的父类模板类型子类也使用模板总结11、类模板成员函数类外实现总结12、类模板分文件编写问题解决1直接包含cpp源文件person.hperson.cppmain.cpp2声明和实现在同一个文件中文件名为.hppperson.hppmain.cpp总结13、类模板与友元1类内实现2类外实现总结14、类模板的案例案例描述实现一个通用数组类案例测试My_Array.hppmain.cpp测试结果案例的完整实现My_Array.hpp#include My_Array.hpp #include string void print_array(MyArrayint arr) { for (int i 0; i arr.get_array_size(); i) { cout arr[i] ; } cout endl; } void test() { cout ---数组类模板测试--- endl; // arr1的数组 MyArrayint arr1(5); // 尾插 for (int i 0; i 5; i) { arr1.Push_Back(i); } cout arr1的输出; print_array(arr1); // 容量和大小 cout arr1的容量 arr1.get_array_capacity() endl; cout arr1的大小 arr1.get_array_size() endl; // 拷贝构造 MyArrayint arr2(arr1); cout arr2的输出; print_array(arr2); // 赋值 MyArrayint arr3(5); arr3 arr1; cout arr3的输出; print_array(arr3); // 尾删 arr2.Pop_Back(); cout arr2尾删后 endl; cout arr2的容量 arr2.get_array_capacity() endl; cout arr2的大小 arr2.get_array_size() endl; cout arr2的输出; print_array(arr2); } // 自定义数据类型 class Person { public: Person() {} Person(string name, int age):m_name(name),m_age(age) {} string m_name; int m_age; }; void print_person(MyArrayPerson arr) { for (int i 0; i arr.get_array_size(); i) { cout 姓名 arr[i].m_name endl; cout 年龄 arr[i].m_age endl; } } void test2() { cout ---自定义数据类型测试--- endl; // 数组类模板存储的数据是Person类型 MyArrayPerson arr(5); Person p1(张三, 20); Person p2(李四, 22); Person p3(王五, 25); Person p4(孙悟空, 18); Person p5(猪八戒, 21); // 插入 arr.Push_Back(p1); arr.Push_Back(p2); arr.Push_Back(p3); arr.Push_Back(p4); arr.Push_Back(p5); // 输出打印 print_person(arr); // 修改元素 //Person p6(唐僧, 30); arr[0] Person(唐僧, 30); cout arr[0] endl; cout 姓名 arr[0].m_name endl; cout 年龄 arr[0].m_age endl; // 容量和大小 cout arr的容量 arr.get_array_capacity() endl; cout arr的大小 arr.get_array_size() endl; } int main() { test(); test2(); system(pause); return 0; }main.cpp#include My_Array.hpp #include string void print_array(MyArrayint arr) { for (int i 0; i arr.get_array_size(); i) { cout arr[i] ; } cout endl; } void test() { cout ---数组类模板测试--- endl; // arr1的数组 MyArrayint arr1(5); // 尾插 for (int i 0; i 5; i) { arr1.Push_Back(i); } cout arr1的输出; print_array(arr1); // 容量和大小 cout arr1的容量 arr1.get_array_capacity() endl; cout arr1的大小 arr1.get_array_size() endl; // 拷贝构造 MyArrayint arr2(arr1); cout arr2的输出; print_array(arr2); // 赋值 MyArrayint arr3(5); arr3 arr1; cout arr3的输出; print_array(arr3); // 尾删 arr2.Pop_Back(); cout arr2尾删后 endl; cout arr2的容量 arr2.get_array_capacity() endl; cout arr2的大小 arr2.get_array_size() endl; cout arr2的输出; print_array(arr2); } // 自定义数据类型 class Person { public: Person() {} Person(string name, int age):m_name(name),m_age(age) {} string m_name; int m_age; }; void print_person(MyArrayPerson arr) { for (int i 0; i arr.get_array_size(); i) { cout 姓名 arr[i].m_name endl; cout 年龄 arr[i].m_age endl; } } void test2() { cout ---自定义数据类型测试--- endl; // 数组类模板存储的数据是Person类型 MyArrayPerson arr(5); Person p1(张三, 20); Person p2(李四, 22); Person p3(王五, 25); Person p4(孙悟空, 18); Person p5(猪八戒, 21); // 插入 arr.Push_Back(p1); arr.Push_Back(p2); arr.Push_Back(p3); arr.Push_Back(p4); arr.Push_Back(p5); // 输出打印 print_person(arr); // 修改元素 //Person p6(唐僧, 30); arr[0] Person(唐僧, 30); cout arr[0] endl; cout 姓名 arr[0].m_name endl; cout 年龄 arr[0].m_age endl; // 容量和大小 cout arr的容量 arr.get_array_capacity() endl; cout arr的大小 arr.get_array_size() endl; } int main() { test(); test2(); system(pause); return 0; }结果二、STL初识STLC中一套由容器、迭代器、算法和函数对象组成的通用模板库提供了高效、可复用的数据结构和算法。STL的诞生1、STL的基本概念STL的六大组件STL的容器、算法、迭代器1容器2算法3迭代器迭代器的种类2、vector1存放内置数据类型2存放自定义数据类型3存放自定义数据类型的指针3、vector容器嵌套容器三、STL的常用容器1、string容器1string构造函数2string赋值操作①string operator(const char *s);②string operator(const string s);③string operator(char c);④string assign(const char *s);⑤string assign(const char *s, int n);⑥string assign(const string s);⑦string assign(int n, char c);3string字符串拼接①string operator(const char* str);②string operator(const char c);③string operator(const string str);④string append(const char *s);⑤string append(const char *s, int n);⑥string append(const string s);⑦string append(const string s, int pos, int n);4string查找和替换查找替换5string字符串比较比较方式字符串比较按照字符的ASCII码对比。返回0返回1返回-16string字符存取string的单个字符存取7string插入和删除8string子串2、vector容器功能vector与普通数组的区别动态扩展1vector构造函数2vector赋值操作①vector operator(const vector vec);②assign(beg,end);③assign(n,elem);3vector的容量和大小resize指定大小若指定的更大默认0填充重载版本指定填充数值若指定的更小多余的删除。总结4vector插入和删除5vector数据存取6vector互换容器①使用示例②实际用途巧用swap收缩内存空间7vector预留空间没有reserve() 预留空间reserve() 预留空间3、deque容器功能deque和vector的区别deque工作原理deque容器的迭代器也支持随机访问。1deque构造函数2deque赋值操作①deque operator(const deque deq);②assign(beg,end);③assign(n,elem);3deque大小操作4deque插入和删除5deque数据存取6deque排序操作4、STL的案例1 - 评委打分案例描述实现步骤结果5、stack容器1基本概念stack先进后出的数据结构只有一个出口。栈中只有栈顶元素可被使用不允许遍历行为。2stack常用接口总结6、queue容器1基本概念queue先进先出的数据结构有两个出口。2queue常用接口总结7、list容器1基本概念链表和结点链表的存储方式不是连续的内存空间因此链表的迭代器只支持前移和后移只能一个一个递增或递减不能跳跃几个递增或递减属于双向迭代器。优点和缺点2list构造函数3list的赋值和交换4list大小操作总结5list插入和删除总结6list数据存取总结7list反转和排序总结8list排序案例总结8、set容器set容器所有元素在插入时会自动排序本质1set构造和赋值总结2set大小和交换总结3set插入和删除总结4set查找和统计总结5set和multiset的区别总结6pair对组的创建功能两种创建方式7set容器排序①内置类型指定排序规则②自定义数据类型指定排序规则总结9、map容器概念本质优点1map构造和赋值2map大小和交换总结3map插入和删除总结4map查找和统计总结5map容器排序总结10、STL案例2 - 员工分组案例描述实现步骤四、STL函数对象1、函数对象概念概念本质2、函数对象的使用特点1函数对象在使用时像普通函数一样调用有参数也有返回值。2函数对象超出普通函数的概念函数对象可以有自己的状态。3函数对象可作为参数传递3、谓词1一元谓词2二元谓词4、内建函数对象1算术仿函数2关系仿函数3逻辑仿函数五、STL常用算法1、常用遍历算法1for_each2transform2、常用查找算法1find2find_if①内置数据类型②自定义数据类型3adjacent_find4binary_search无序序列进行binary_search查找结果未知所以必须是有序序列才可正确查找。5count①内置数据类型②自定义数据类型6count_if①内置数据类型②自定义数据类型3、常用排序算法1sort2random_shuffle3merge4reverse4、常用拷贝和替换算法1copy2replace3replace_if3swap5、常用算术生成算法1accumulate2fill6、常用集合算法1set_intersection2set_union3set_difference六、演讲比赛流程管理系统有待解锁。。。七、机房预约系统有待解锁。。。