模板的局限性
1.C++函数模板案例2.普通函数与函数模板调用规则3.普通函数与函数模板调用规则2
4.模板的局限性
5.类模板6.类模板与函数模板的区别7.类模板中成员函数创建时机8.类模板对象做函数参数9.类模板与继承10.类模板成员函数类外实现11.类模板分文件编写12.类模板与友元13.类模板案例14.STL初识15.容器算法迭代器初识16.Vector中存放自定义数据类型17.Vector容器镶套容器18.STL---常用容器19.string赋值操作20.string字符串拼接21.string查找和替换22.string字符串比较/字符存取/插入和删除/子串获取23.vector容器/构造函数/赋值操作/容量和大小/插入和删除/数据存储/互换容器/预留空间24.deque容器/构造函数/赋值操作/大小操作/插入和删除/数据存取/排序25.案例--评委打分26.力扣---两数之和---unordered_map-STL容器局限性:
模板的通用性并不是万能的
例如:
template<typename T> void f(T a,T b) { a=b; }
在上述代码中提供的赋值操作,如果传入的a和b是一个数组,就无法实现了
再例如:
template<typename T> void f(T a,T b) { if (a>b) { ..... } }
在上述代码中,如果T的数据类型传入的是像Person这样的自定义数据类型,也无法正常运行
因此C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板
#include <iostream> using namespace std; #include <string> //模板的局限性 //模板并不是万能的,有些特定数据类型,需要用具体化方式做特殊实现 class Person { public: Person(string name,int age) { this->m_name=name; this->m_age=age; } //姓名 string m_name; //年龄 int m_age; }; //对比两个数据是否相等函数 template<typename T> 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 test02() { Person p1("Tom",10); Person p2("Tom",10); bool res=myCompare(p1,p2); if (res) { cout<<"p1==p2"<<endl; } else { cout<<"p1!=p2"<<endl; } } void test01() { int a=10; int b=20; bool res=myCompare(a,b); if (res) { cout<<"a==b"<<endl; } else { cout<<"a!=b"<<endl; } } int main() { //test01(); test02(); return 0; }
总结:
利用具体化的模板,可以解决自定义类型的通用化
学习模板并不是为了写模板,而是在STL能够运用系统提供的模板
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理