C++ 模板学习 函数模板、类模板、迭代器模板
使用模板能够极大到使得代码可重用。
记录一下,方便后续使用。
1. 函数模板,支持多种类型参数
#include <stdio.h>
#include <math.h> //函数模板
template <class T>
T add(T a, T b){
return a + b;
} //函数模板特殊化
template <>
double add<double>(double a, double b){
return floor(a + b);
} class Vector{
public:
Vector(int a = , int b = ):_a(a), _b(b) { }
Vector operator +(Vector &v1){ //重载+
Vector res;
res._a = this->_a + v1._a;
res._b = this->_b + v1._b;
return res;
} int _a;
int _b;
}; int main (){
printf("3 + 4 = %d\n", add(, )); //支持int
printf("5.6 + 3.7 = %.0lf\n", add(5.6, 3.7)); //支持double Vector v1(,);
Vector v2(,);
Vector v3 = add(v1, v2); //支持类
printf("v3(%d, %d)\n", v3._a, v3._b);
return ;
}
2. 迭代器模板,支持多种容器
#include <iostream>
#include <vector>
#include <list> //该模板函数, 支持各种容器到数据打印
template <class iterator>
void print(iterator begin, iterator end){
for(iterator it = begin; it != end; ++it){
std::cout << *it << std::endl;
}
} //使用迭代器需要添加关键字typename
//该模板函数, 支持各种容器到数据打印
template <class container>
void print(container con){
for(typename container::iterator it = con.begin(); it != con.end(); ++it){
std::cout << *it << std::endl;
}
} int main (){
std::vector<int> my_ver;
my_ver.push_back();
my_ver.push_back();
my_ver.push_back();
print(my_ver.begin(), my_ver.end()); std::list<std::string> my_list;
my_list.push_back("No.1");
my_list.push_back("No.2");
my_list.push_back("No.3");
print(my_list);
return ;
}
3.类模板
test_temple.h
#ifndef MATH_CLASS
#define MATH_CLASS template <class T>
class Math{
public:
static T add(T v1, T v2){ //方法在类内声明+实现
return v1 + v2;
} static T sub(T v1, T v2); //方法在类内声明
}; #endif
test_temple.cpp
#include "test_temple.h" #ifndef MATH_CPP
#define MATH_CPP template <class T>
T Math<T>::sub(T v1, T v2){
return v1 - v2;
} #endif
test.h
//模板类到声明、实现都必须被编译时包含
//1.可以将实现都写到头文件
//2.或者同时包含.h , .cpp文件 //这里把他们了封装, 用户只需要包含test.h即可
#include "test_temple.h"
#include "test_temple.cpp"
main.cpp
#include <stdio.h>
#include "test.h" int main(){
printf("3 + 4 = %d\n", Math<int>::add(, ));
printf("20.8 - 5.1 = %.2lf\n", Math<double>::sub(20.8, 5.1));
return ;
}
C++ 模板学习 函数模板、类模板、迭代器模板的更多相关文章
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- 转:C++模板学习
C++ 模板 转:http://www.runoob.com/cplusplus/cpp-templates.html 2018-01-05 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的 ...
- tornado-模板继承extend,函数和类的导入
大 import tornado.ioloop import tornado.web import tornado.httpserver # 非阻塞 import tornado.options # ...
- C++模板学习:函数模板、结构体模板、类模板
C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(i ...
- 《C++ Primer Plus》第16章 string类和标准模板库 学习笔记
C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具string类为将字符串作为对象来处理提供了一种方便的方法.string类提供了自动内存管理动能以及众多处理字 ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- C++中模板类使用友元模板函数
在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定 ...
- 初步C++类模板学习笔记
类模板 实现:在上课时间的定义给它的一个或多个参数,这些参数代表了不同的数据类型. -->抽象的类. 在调用类模板时, 指定參数, 由编 ...
随机推荐
- MySQL服务器SSD性能问题分析与测试
[问题] 我们有台HP的服务器,SSD在写IOPS约5000时,%util达到80%以上,那么这块SSD的性能究竟有没有问题,为解决这个问题做了下面测试. [工具] blktrace是linux下用来 ...
- 【二分答案+2-SAT】Now or later UVALive - 3211
题目链接:https://cn.vjudge.net/contest/209473#problem/J 题目大意: 有n架飞机,每架飞机有两个可降落时间点a,b(a<b)(即一架飞机可以选择在时 ...
- 将NX模型导入Process Designer的方法
如何把一个有焊点的零件从nx中输入到process designer 中? 用户在NX中做了一个prt文件, 想把它输入到process designer中, 并且包括焊点信息, 该如何做? 解决 ...
- Python进行Android开发步骤
移动应用开发 1. 建立开发环境 下载软件开发包(SDK): http://developer.android.com/sdk/index.html adt-bundle- ...
- leetcode 树的锯齿形状遍历
二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,n ...
- 21.python中的闭包和装饰器
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...
- 「BZOJ 3645」小朋友与二叉树
「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- HDU5320 : Fan Li
考虑枚举左端点i,则随着右端点的右移,一共只有$O(\log n)$种不同的gcd取值.所以首先通过ST表+二分查找预处理出$O(n\log n)$个四元组(x,i,l,r),表示左端点为i,右端点取 ...
- error/exception/runtime exception区别
(1)java中的异常是什么? 异常指的是程序运行过程中出现的非正常情况或错误,当程序违反了语义规则时,jvm就会将出现的错误表示为一个异常抛出.在java中,一切皆对象,异常也是,它被当作一个对象, ...