C++ 模板 技术教程文章

C++类模板 template <class T>【代码】

C++在发展的后期增加了模板(template )的功能,提供了解决这类问题的途径。可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数。 比如:class?Compare_int class Compare_float都是比较大小的函数,只是参数类型不同,于是用一个类模版综合成一个函数:template <class numtype> //声明一个模板,虚拟类型名为numtype class Compare //类模板名为Compare { public : Compare(numtype a,numtype b){ x=a;y=b; } ...

c++类模板【代码】

1.1类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。 语法: template<typename T> 类解释: template — 声明创建模板 typename — 表面其后面的符号是一种数据类型,可以用class代替 T — 通用的数据类型,名称可以替换,通常为大写字母 示例: #include <string> //类模板 template<class NameType, class AgeType> class Person { public:Person(NameType name, AgeType age){this...

《C++ Templates》模板术语【图】

关于类模板和模板类得区分问题: 个人认为主要是针对于翻译的相关问题:即 class template 和 template class的相关问题; class template“类模板”主要是针对于参数化的类模板描述,即最初的某个类类型的模板定义; template class“模板类”主要是针对于模板实例化的类,即对某个模板进行实例化的结果,抑或是具有template-id的类; 函数模板/模板函数,成员函数模板/模板成员函数的关系也类似于此; 关于模板特化的问题: ...

C++05模板【代码】【图】

C++模板 友元函数 关键字:friend 友元全局函数:将全局函数声明为友元函数就是友元全局函数,可以访问到私有数据成员和私有成员函数。friend void printTime(Time &t); #include<iostream>` `using namespace std;` `class Time{` `friend void printTime(Time &t);` `public:` `Time(int hour,int minute,int second);` `private:` `int m_iHour;` `int m_iMinute;` `int m_iSecond;` }; =========================...

C++模板元编程(3)模板显示具体化【代码】

前面我们介绍了模板隐式实例化和显示实例化,今天介绍另外一个截然不同的概念,模板具体化。 来说说模板遇到的问题,也就是为什么要有模板具体化方法。模板函数自身有一定的局限性。由于其采用对对象类型的泛化处理,导致其在内部实现的细节上无法保证对所有类型的通用性。 假设定义了如下结构: struct job {char name[40];double salary;int floor; };又假设你希望能够交换这两个结构的内容。原来的模板将使用下面的代码来完成交...

C++标准模板库STL链表类list实现表外排序【代码】

1.表外排序 对链表的排序可分为表内排序和表外排序,表内排序将改变链表内原来的排列顺序,而表外排序不改变原链表中的排列顺序,并且排序效率也较高,我们可以借助指针数组(迭代器数组)的方法实现表外排序,代码如下所示: #include <list> #include <iostream> #include <random> #include <time.h> using namespace std; typedef int DATA; //定义全局链表 list<DATA> g_list; typedef list<DATA>::iterator POSITION; //数据输...

C++标准库函数 end 的实现原理(非类型模板参数)

在刚开始学习《C++ Primer》的时候遇到了 end 函数,感觉很神奇,但又很迷惑:为什么能获得数组的尾后指针呢?编译器也不会在内存中申请一块空间放数组元素的个数啊!最近再一次遇到了 end 就看了一下它的实现终于明白了。 先说以下C语言中获得数组元素个数的方法。int arr[] = {1, 2, 3}; size_t n = sizeof(arr) / sizeof(int); //n为元素个数 sizeof 返回一个常量表达式,是在编译时期确定返回值的。也就是说在编译时期是可以知...

P1226 【模板】快速幂||取余运算 C++【代码】【图】

日期:2021-04-24 作者:19届WY 标签:快速幂,同余运算 题目描述同余运算的主要性质解题: 利用同余运算的性质,可以每次将p进行二分取余,若p为偶数,则xp=(x2)p/2,若p为奇数,则xp=x*(x2)p/2。(考虑p>0的情况)每次将p/2,若p为奇数,则xp=x*(x2)p/2,中前面那个单独的x也要取余之后再放进s中,若p为偶数则直接计算x2再取余,这里不用再与s进行计算,因为最后一步总会得到p=1,结果都会进入s中(考虑p=0的情况)最后输出的时候...

C++关于模板之间的继承,导致的模板子类的成员看不到(cannot

首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。 这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。 这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所...

c++ (模板 && 类模板)【代码】

c++ (模板 && 类模板) xxx.hpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> //#include "Person.h" #include "Person.hpp"using namespace std; //建议模板不要份文件编写,写到一个类中即可,类内进行声明和实现,最后把类名改为.hpp int main() {Person<string, int> p("虚竹", 10);p.showPerson();return 0; }xxx.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> //#include "Person.h" #include "Person.hpp...

C++类模板分文件编写【代码】

直接分文件编写的问题 类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到解决方法 解决方式1:直接在需要用到的文件中包含.cpp源文件 #include "person.cpp"解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制 #pragma once #include <iostream> using namespace std; #include <string>template<class T1, class T2> class Person { public:Person(T1 name, T2 age);void...

ACM模式下C++的输入输出格式模板【代码】

ACM模式下C++的输入输出格式模板 读取字符读取字符串读取整数读取数组转换为链表转换为二叉树 读取字符 代码 int main() {char ch = getchar();while (ch) {cout << ch;ch = getchar();}return 0; }输出 c c h h a a r r读取字符串 代码 int main() {string line;while (getline(cin, line)) {cout << line;}return 0; }输出 hello hello world world读取整数 代码 int stringToInteger(string input) {return stoi(input); }int m...

C++学习笔记之模板【代码】

一、函数模板 二、类模板 一、函数模板 ①函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表。 ②语法:template<typename T> 注:typename可以用class代替。 ③代码实例#include <iostream> using namespace std; template<class T> void Swap(T & x, T & y) {T tmp = x;x = y;y = tmp; } int main() {int n = 1, m = 2;Swap(n, m); //编译器自动生成 void Swap (int &, in...

C++ 函数模板【代码】

函数模板是通用的函数描述,是使用泛型来定义的函数。泛型可用具体的类型(如int,double)来替换。1. 函数模板1.1 什么是函数模板1.2 重载的函数模板 2. 具体化2.1 显式具体化2.2 实列化2.3 实列化 与 具体化? 1. 函数模板 1.1 什么是函数模板 函数模板允许使用任意的类型来定义函数,例如,可这样建立一个swap模板: template <typename T> // 该句可改为: template <class T> void swap(T& a, T& b){T temp;temp = a;a = b;b ...

C++编写类模板声明和实现要注意的地方【图】

一:一般情况下,C++编写代码时,类的声明和实现是由2个文件分开来写的。".h"放的是类的声明,“.cpp”放的是类的实现,然后使用该类的时候,就把该类对应的“ .h ”引用上就OK的了。但是在类模板中这样就不行。(1)如下:Person.h的这个文件放Person类的声明#include <iostream>#include <string>using namespace std;template<class T1,class T2>class Person{public:Person(T1 name,T2 age);void showPerson();T1 m_...

C++模板精选

C++模板的使用一共有以下几种情况。 ? 函数模板 ? 类模板 ? 模板参数 ? 成员模板 //empty case template struct GetInputView<Continuation,ViewList<>>:public Continuation { template static void data_deps(IOVec *deps){ Continuation::template data_deps (deps); } };使用的时候 Ad* allocate_adv(){ return this->_data->template alloc_adv(); } 2 函数模板 template inline T const& max(T const& a, T const& b) { ret...

C++ 类模板案例 (实现一个通用的数组类)【代码】

案例描述:实现一个通用的数组类,要求如下: 可以对内置数据类型以及自定义数据类型的数据进行存储将数组中的数据存储到堆区构造函数中可以传入数组容量提供对应的拷贝构造函数以及operator=防止浅拷贝问题提供尾插法和尾删法堆数组中数据进行添加和删除可以通过下标方式访问数组中元素可以获取数组中当前元素个数和数组的容量 .hpp文件 #include <iostream> #include <string> using namespace std;template<class T> class MyAr...

C++ 函数模板与类模板【代码】

函数模板 函数模板是统用的函数描述,其使用泛型定义函数,其中泛型可被具体类型(如 int、double)替换。 调用模板函数,可以使用自动类型推导或显式指定类型。 语法: template <typename T> ret-type func(parameter list) {// 函数的主体 }注意事项:自动类型推导,必须推导出一致的数据类型才可以使用 模板必须确定 T 的数据类型才可以使用 class 可以替换 typename ,typename 是新标准中的关键字。示例 1: 下面的代码定义了...

【C++】模板进阶【代码】

模板进阶 1.非类型模板参数2. 模板的特化2.1 函数模板特化2.2 类模板特化2.2.1 全特化2.2.2 偏特化 2.3 类模板特化应用之类型萃取 3. 模板分离编译3.1 什么是分离编译3.1.1 不含模板代码的分离编译3.1.2 含有模板代码的分离编译 3.2 问题解决方法 4. 模板总结 1.非类型模板参数 类型模板参数:出现在模板参数列表中,跟在class或者typename后面的类型名称非类型模板参数:使用一个常量来作为类(函数)模板的一个参数,在类(函数)模板...

C++模板沉思录【代码】

0 论抽象——前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和。如果你对Python很熟悉,你一定会觉得:“哇!这太简单了!”,然后写出以下代码: def Plus(lhs, rhs):return lhs + rhs那么,C语言又如何呢?你需要面对这样的问题: /* 这里写什么?*/ Plus(/* 这里写什么?*/ lhs, /* 这里写什么?*/ rhs) {return lhs + rhs; }也许你很快就能想到以下解法中的一些或全部:硬编码为某个特定类型:int Plus(int lhs,...