C++的学习第三部分

发布时间:2026/10/3 20:46:49

C++的学习第三部分 一、模板模板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六、演讲比赛流程管理系统有待解锁。。。七、机房预约系统有待解锁。。。
延伸阅读

更多相关文章

2026/10/3 20:46:27

Windows系统SSD优化全攻略:从硬件安装到系统设置的性能榨取

1. 项目概述:为什么Windows系统需要SSD优化? 如果你还在用传统的机械硬盘(HDD)运行Windows,那感觉就像开着一辆老爷车在高速公路上堵车。每次开机、打开软件、加载游戏,都能听到硬盘“咔咔”的读盘声&#…

2026/10/3 0:59:51

OpenClaw智能运维实战:OpenCloudOS自动化监控与自愈部署指南

1. 项目概述:从手动到智能的运维范式跃迁 在传统的服务器运维世界里,我们习惯了敲击命令行,盯着监控图表,在告警邮件和日志海洋里“救火”。无论是部署应用、排查故障还是性能调优,很大程度上依赖运维工程师的经验和即…

2026/9/28 0:59:05

FastContext: Training Efficient Repository Explorer for Coding Agents

FastContext 论文完整总结+指定章节双语翻译 一、论文整体核心内容总结 1. 研究背景与待解决痛点 当前大模型代码智能体(如SWE-Agent、Cursor等)完成仓库级修复/问答任务时,仓库代码探索是核心性能瓶颈: 探索(读文件、全局检索)占用主模型56.2%工具轮次、46.5%总token…

2026/10/3 20:45:49

VRChat头像性能优化:避免“贪多”工程,打造高评分角色

VRChat 里有一个很常见的日文词叫“よくばり”,翻译过来就是“贪多”。这个词用来形容一类头像工程再合适不过:一个人物模型里想同时塞进 4K 贴图、几十个待机动作、满身 PhysBone、粒子特效、换装部件,甚至再挂一个音乐播放器。结果往往是模…

2026/10/3 20:40:49

数据管理与论文写作并行:按阶段推进的研究节奏怎么排

数据工作和论文写作挤在同一段时间里,几乎是每位研究生都会遇到的排期难题。多数人卡住的不是不会写,而是两条线的节拍没有对齐。我们在梳理用户反馈时发现,把研究数据与论文写作按成熟度切成四段、给每段设定明确的两线配比,返工…

2026/10/3 20:40:49

双向分流FIN标记、TCB服务逻辑与TCP断开连接流程介绍

文章目录 一、TCP双向分流里的FIN 1.FIN信息 1.1放置FIN 1.1.1处前预剩发 1.1.2处后被遗漏 1.2发送FIN 1.2.1剩余已发完 1.2.2独立仍接收 1.3接收FIN 1.3.1现在已收完 1.3.2独立仍在发 二、数据的需求与TCB的服务 1.数据需求TCB的发收服务 1.1需本端TCB可靠发送 …

2026/10/3 20:40:49

DeepSeek Harness 开源贡献手记:从零到合入主线

1. 引言:为什么参与开源贡献 本文记录我参与 DeepSeek Harness 开源项目的完整过程,从发现问题、定位源码、编写补丁到最终合入主线的真实经历,希望能为同样想参与开源贡献的开发者提供一份可参考的路线图。 2. 项目背景与初步调研 在动手…

2026/10/3 20:40:49

面试官:MySQL中的 distinct 和 group by 哪个效率更高?

一、开篇:一道高频面试题背后的问题在 MySQL 相关的面试中,有一道题经常被面试官问到:distinct 和 group by 都能去重,它们哪个效率更高?很多候选人听到这个问题后会下意识地回答「distinct 更快,因为它的语…

2026/10/3 20:40:49

面试官:BIO、NIO、AIO 的区别是什么?

一、开篇:从一个面试场景说起面试官经常会抛出一个看似简单、实则非常考察底层功底的题目:「说说 BIO、NIO、AIO 的区别」。很多同学能背出「BIO 是阻塞、NIO 是非阻塞、AIO 是异步非阻塞」,但如果继续追问「为什么 NIO 是非阻塞的」「底层分…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/2 18:20:53

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 15:02:19

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 0:04:31

国内大学生必备的AI写作辅助软件是哪款?

国内高校学生在论文写作过程中,越来越依赖AI辅助工具提升效率,主流方案以本土化全流程工具为核心,结合通用大模型与专业插件,覆盖选题构思、框架搭建、初稿撰写、查重降重、格式调整等关键环节,本文将深入解析当前主流…

2026/10/3 0:04:31

Codex接入Jev模型完整指南:配置方法、本地部署与踩坑排查

最近不少人在讨论 Codex 搭配 Jev 这套玩法,我一开始没太当回事,直到自己把 Jev 接进 Codex跑了几轮编码任务之后,才明白那些说“直接起飞”的人是怎么想的。Codex 作为工具本身已经够能打了,但模型固定、上下文策略固定&#xff…

2026/10/3 0:04:31

GitHub 热门: NVIDIA/Model-Optimizer

👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >GitHub 热门: NVIDIA/Model-Optimizer 凌晨两点,你刚把跑通了的 Qwen3.…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑