1 #include<iostream>2usingnamespace std;3// 通用模板计算一个表达式的值 4 template<class Ta,class Tb,class Tc>5 Ta Abc(const Ta *a,const Tb *b,const Tc *c)6{7return (*a)+(*b)+(*c);8}9int main()
10{
11int a=10,*p;
12float b=2.6,*q;
13char c=‘A‘,*r;
14 p=&a;
15 q=&b;
16 r=&c;
17 cout<<"*p= "<<*p<<",*q= "<<*q<<",*r="<<int(*r)<<endl;
18 cout<<Abc(p,q,r)<<endl;
19return0;
20 } 程序...
第16章 string类和标准模板库1. string容易被忽略的构造函数:string(size_type n, char c)长度为n,每个字母都为cstring(const string & str, size_type pos = 0, size_type n = pos)初始化为str中从pos开始到结尾的字符,或从pos开始的n个字符string(const char *s, size_type n)初始化为s指向的前n个字符,即使超过了s的结尾;string(Iter begin, Iter end)2. size_type是一个依赖于实现的整型,是在头文件string中定义的。stri...
1.解析一个正确的模板类 (1)首先,我们想创造一个模板,可以先针对一个特定的类型参数设计它的行为方式,然后在对抽象的一般类型进行推广。例如我们可以先设计String<char>类的具体实现,然后再推广到String<C>类模板。 (2)类模板的名字是不能重载的。所以,如果在某个作用域内声明了一个类模板,就不能有其他同样名字的实体了。template<class T> class String{/*...*/};
class String {/*...*/}; ...
1 #include<bits/stdc++.h>2usingnamespace std;3constint maxn=5005;4int N,M;5int stac[maxn],top=0;//Tarjan算法中的栈 6bool instac[maxn];//检查是否在栈中 7int dfn[maxn];//深度优先搜索访问次序 8int low[maxn];//能追溯到的最早的次序 9int tot=0;//有向图强连通分量个数10int index=0;//索引号11 vector<int>to[maxn];
12 vector<int> kin[maxn];//获得强连通分量结果13int inkin[maxn];//记录每个点在第几号强连通分量里...
#include <iostream>
#include <cstdint>
#include <list>
#include <string>template<typename T>
typename std::enable_if<std::is_integral<T>::value, std::string>::type to_string(const T & val)
{return std::to_string(val);
}
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, std::string>::type to_string(const T & val)
{return std::to_string(val);
}
template<typename T>
typen...
一,关于编译链接编译指的的把编译单元生成目标文件的过程链接是把目标文件链接到一起的过程编译单元:可以认为是一个.c或者.cpp文件。每个编译单元经过预处理会得到一个临时的编译单元。预处理会间接包含其他文件还会展开宏调用。每个编译单元编译成目标文件后会暴露自己内部的符号。(比如有个fun函数,就会暴露出于fun函数对应的符号,其他的函数和变量也是一样的。但是也有不会暴露出去的,比如加了static修饰的函数或变量)每...
1) 意图定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤2) 结构 其中:AbstractClass(抽象类)定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定义一个算法骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作ConcreateClass(具体类)定义原语操作以完成算法中与特定子类...
1 #include <iostream>2 template<class Type>3class Stack4{5public:6 Stack(int MaxStackSize=100);7bool IsFull();8bool IsEmpty();9void StackFull();
10void StackEmpty();
11void Push(const Type& x);
12 Type Pop(Type& x);
13private:
14int top;
15 Type * stack;
16int MaxSize;
17};
18 template<class Type>
19 Stack<Type>::Stack(int MaxStackSize):MaxSize(MaxStackSize)//构造函数 20{
2...
1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{return(x>y)?x:y ;}//函数2.float max( float x,float y){return (x>y)? x:y ;}//函数3.double max(double x,double y){return (c>y)? x:y ;}但如果在主函数...
(1)定义函数模板(function template)函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。// implement strcmp-like generic compare function
template <typename T>
int compare(const T &v1, const T &v2)
{if (v1 < v2) return -1;if (v2 < v1) return 1;return 0;
}模板定义以关键字template开始,后接尖括号括住的模板形参表。模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非...
主要原因:C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来;如以下代码:main.cpp中调用到模板类A的方法A<int>::f,因A<int>::f在test.cpp中实现,编译器在#1处并不知道A<int>::f的定义,故寄希望于连接器,实际上test.cpp编译出来的test.obj文件中关于A::f一行二进制代码也没有,因为模板类A在test.cpp未被实例化,此时连接器就会报错。所以,必须把模板类的实现放在.h中,此时main.cpp中调用A<int>::f方法时,就...
求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型。案例如下:#include<iostream>#include<stdlib.h> voidmain(){
doubledb = 10.9;
double *pdb= &db;
autonum =
pdb;
//通过typeid的方式获得数据类型
std::cout<< typeid(db).name()<< std::endl;
std::cout<< typeid(num).name()<< std::endl;
std::cout<< typeid(pdb).name()<< std::endl;
//typeid(db).name() db2
//decltype...
1、模板的概念我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y)
{ return(x>y)?x:y ; }//函数2.
float max( float x,float y){ return (x>y)? x:y ; }//函数3.
double max(double x,double y)
{ return (x>y)? x:y ; }但如...
C++为我们提供了函数模板机制。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。 为什么要有函数模板 下面,我们就通过一个例子来说明为什么需要有函数模...
1泛型程序设计的基本概念泛型程序设计: 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础术语:概念用来界定具备一定功能的数据类型。例如: 将“可以比大小的所有数据类型(有比较运算符)”这一概念记为Comparable 将“具有公有的复制构造函数并可以用‘=’赋值的数据类型”这一概念记为Assignable 将“可以比大小、具有公有的复...