精华内容
下载资源
问答
  • 模板链接失败

    2012-08-20 14:28:29
    当将类中的模板成员函数(或者一般的模板函数)的声明和定义分别放在.h和.cpp文件中时,当在别的文件调用此模板函数时,可能会出现未定义的情况。  这是由于当你不使用这个模板函数时,编译器并不实例化它。当你...

      当将类中的模板成员函数(或者一般的模板函数)的声明和定义分别放在.h和.cpp文件中时,当在别的文件调用此模板函数时,可能会出现未定义的情况。

        这是由于当你不使用这个模板函数时,编译器并不实例化它。当你使用时,编译器需要实例化它,因为编译器时一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化要看到该模板的完整定义,需要都放在头文件中(即声明和定义都放在.h中即可)。(VC和VS2008需要这样处理,VS2010未知,应该情况类似)。

         这不同于普通的函数,在使用普通函数时,编译时只需要看到函数的声明即可编译,而在链接时由链接器来确定该函数的实体。


    虚函数在运行期决定行为
    模板在编译期决定行为

    展开全文
  • C++ 模板的编译与链接

    千次阅读 2017-06-07 20:33:05
    模板是C++泛型编程的基础,一个模板就是一个创建类或者函数的公式;在具体使用时,我们需要将模板参数转化为具体类型,比如int,float,Vector以及自定义类型;这种转换过程发生在编译阶段。定义模板假如我们需要完成...

    模板是C++泛型编程的基础,一个模板就是一个创建类或者函数的公式;在具体使用时,我们需要将模板参数转化为具体类型,比如int,float,Vector以及自定义类型;这种转换过程发生在编译阶段。

    定义模板

    假如我们需要完成一个数值幂次方函数的功能,这个数组可以是int,也可以是float;我们的函数分别如下:

    整型值的幂次函数:

    int Power(int base, int index)
    {
        if (0 == index) return (int)1;
        if (0 > index) return(int)0; 
    
        int result =  base;
        while (--index)
        {
            result *= base;
        }
    
        return result;
    }

    浮点型的幂次函数:

    float Power(float base, int index)
    {
        if (0 == index) return (float)1;
        if (0 > index) return(float)0; 
    
        float result =  base;
        while (--index)
        {
            result *= base;
        }
    
        return result;
    }

    可以发现这两个函数基本一样,唯一的差异就是参数和返回值类型不同,函数体完全一致;若还需要针对long型,long long型,我们需要写两份几乎一样的代码。

    针对这种情况,C++给出了模板技术,代码编写阶段类型先不确定;在编译器编译时根据函数入参类型再确定,从而生成具体的函数版本。

    函数模板

    函数模板定义

    函数模板的定义如下,由template关键字,一对尖括号组成,T是由typename 标识的不确定类型,编译器会在编译阶段生成具体的函数版本。

    template<typename T>
    T Power(T base, int index)
    {
      if (0 == index) return (T)1;
      if (0 > index)  return(T)0;
    
      T result =  base;
      while (--index)
      {
         result *= base;
      }
      return result;
    }

    实例化函数模板

    当我们调用一个函数模板时,编译器会根据函数实参来推断模板的具体类型,然后根据这个类型实例化这个类型的版本函数。比如:

    (1) cout << "power(2,3):" << Power(2,3) << endl;
    (2) cout << "power(2.1,3):" << Power(2.1f,3) << endl;

    编译器在编译时,遇到语句(1),可以推断出模板实参的类型为int,编译器则开始生成入参为int型的函数版本;同理,遇到语句(2)则生成入参为float型的函数版本;
    它们的函数声明如下:

    (版本一)int Power(int base, int index)
    (版本二)float Power(float base, int index)

    类模板

    类模板(Class template)是用来生成类的蓝图,其原理基本和函数模板基本一致;所不同的是,使用类模板时,我们必须显示指定类模板的类型信息。

    类模板定义:

    类模板的定义如下:

    template <typename T>
    class CThree
    {
    public:
        CThree(T a, T b, T c) ;
        T Min();
        T Max();
    private:
        T m_a;
        T m_b;
        T m_c;
    };

    类模板实现:

    需要注意的是, 每个成员函数前面都要加上 template< class T >,而且类的名称应该使用CThree< T >.示例代码如下:

    template<class T>
    T CThree<T>::Min()
    {
        T MinVal = m_a < m_b ? m_a : m_b;
    
        return MinVal < m_c ? MinVal :m_c;
    }
    template<class T>
    T CThree<T>::Max()
    {
        T MaxVal = m_a > m_b ? m_a : m_b;
    
        return MaxVal > m_c ? MaxVal :m_c;
    }
    
    template<class T>
    CThree<T>::CThree(T a, T b, T c):
    m_a(a),
    m_b(b),
    m_c(c)
    {
        return;
    }

    实例化类模板

    类模板和函数模板一样,也存在实例化的过程,当编译器遇到语句(1)(2)时,编译器则生成int型和float型的类版本,这两个版本是相互独立的类,不会相互影响。

    (1) CThree<int> IntInstance(1,2,4);
    (2) CThree<float> FloatInstance(1.1f,2.2f,4.4f);

    模板编译与链接

    现在就来看看,编译器对模板是如何编译和链接吧;

    当编译器遇到一个template时,不能够立马为他产生机器代码,它必须等到template被指定某种类型。也就是说,函数模板和类模板的完整定义将出现在template被使用的每一个角落,比如遇到上述中的4个语句时,才能确定编译内容,否则编译器没有足够的信息产生机器代码。

    对于不同的编译器,其对模板的编译和链接技术也会有所不同,其中一个常用的技术称之为Smart,其基本原理如下:

    1. 模板编译时,以每个cpp文件为编译单位,实例化该文件中的函数模板和类模板
    2. 链接器在链接每个目标文件时,会检测是否存在相同的实例;有存在相同的实例版本,则删除一个重复的实例,保证模板实例化没有重复存在。

    比如我们有一个程序,包含A.cpp和B.cpp,它们都调用了CThree模板类,在A文件中定义了int和double型的模板类,在B文件中定义了int和float型的模板类;在编译器编译时.cpp文件为编译基础,生成A.obj和B.obj目标文件,即使A.obj和B.obj存在重复的实例版本,但是在链接时,链接器会把所有冗余的模板实例代码删除,保证exe中的实例都是唯一的。编译原理和链接原理,如下所示:

    这里写图片描述

    展开全文
  • 模板属于超市冷藏生鲜供应、食堂绿色蔬菜、水果产品供应类企业都可使用。 自带最新的手机移动端,同一个后台,数据即时同步,简单适用! 原创设计、手工书写DIV+CSS,兼容IE10+、Firefox、Chrome

    超市饭店生鲜食材供应公司网站搭建模板,整站绿色主题风格,首页排版布局合理大气,带有手机端自适应跳转功能,整站数据完整测试无错,数据库完整备份,删除无用的冗余表,整站打包下载,适用于绿色水果蔬菜配送等相关公司企业网站使用,当然这套模板栏目和内容做修改的话,也可以作为其他类型的网站,模板资源都是相通的。该模板属于超市冷藏生鲜供应、食堂绿色蔬菜、水果产品供应链类企业都可使用。

    自带最新的手机移动端,同一个后台,数据即时同步,简单适用!
    原创设计、手工书写DIV+CSS,兼容IE10+、Firefox、Chrome、360浏览器等主流浏览器;页面简洁,容易管理,附带整站测试数据!
    生鲜蔬菜供应链网站搭建模板
    下载地址:http://www.biaoxintong.com/canyinmeishi/2216.html
    模板特点:
    1.一款利于SEO的模板,手工CSS+DIV,图片ALT,H系列标签已合理运用。
    2.同步手机站功能,手机站很强大。
    3.幻灯电话修改带有psd源文件。

    使用程序:
    织梦DEDECMS版本都可以使用。

    模板页面:
    index.htm 首页模板
    head.htm
    footer.htm
    article_article.htm 文章内容
    这里不一一列出!

    温馨提示:
    按照正常的织梦安装步骤来安装还原就可以用了,从后台重新点击保存下系统基本参数。 系统>系统基本参数> 保存(确定)。
    后期bug修正:
    暂无

    安装方法:
    按照正常的织梦安装步骤安装,在后台还原数据就可以了,后台重新点击保存下系统基本参数。 系统>系统基本参数> 保存(确定)。详细步骤如下:
    1.将源码完整上传至网站目录,运行install ,即打开http://您的网址/install/index.php
    2.输入数据库信息,网站信息,并根据提示进行安装(安装时请不要修改数据表前缀,否则无法顺利恢复数据)
    3.安装完成以后进入后台,找到《系统》->《数据库备份/还原》,进行还原数据,恢复数据库。
    4.在后台,点“系统”—“系统参数设置”这里,修改一下网站设置,重新点一下“确定”。后台,点"生成"—“更新系统缓存”
    5.网站后台默认为/dede 后台用户名和密码都为:admin。请配置好网站后修改后台地址和用户名密码,以确保安全。

    展开全文
  •   (题外话) 虽然LCA最快不是树剖分 但由于想学 于是刻苦钻♂研了下 由于网上那些都是零零碎碎(这不是我的超链接)的 自己通过...模板在这里呐 戳进去即可 #include &lt;iostream&gt; #includ...

     

     

    (题外话)

    虽然LCA最快不是树链剖分 但由于想学 于是刻苦钻♂研了下

    由于网上那些都是零零碎碎(这不是我的超链接)的 自己通过东拼西凑(这也不是)加理解终于懂了

    然后以自己的理解再复述一遍~可谓是倾囊以授啦~

    (正篇)

    有关树链剖分的概念戳进这一篇~

    原理具体解释于程序中~

    模板在这里呐 戳进去即可

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    const int MAX=500005;
    struct Edge //邻接表
    {
    	int to,next;
    }edge[MAX << 1];
    
    
    int fa[MAX],     top[MAX],   deep[MAX], size[MAX],      son[MAX];
      //该点的父亲 点所在链顶点   点深度值  点子树节点个数 点的重儿子 (分别对应)
    int first[MAX],tot;
    void add(int i,int j)
    { //邻接表存无向图~
    	edge[++tot].to = j;
    	edge[tot].next = first[i];
    	first[i] = tot;
    }
    
    
    void dfs1(int p) //p 当前节点
    { //第一次dfs,用以求出所有节点的父亲节点 & 深度 & 子节点个数 & 重节点
    	size[p] = 1; //p子节点数量初始化 把自己算进去 因为到最后一层的时候用来返回 才能让其父亲得到准确的子节点个数
    	deep[p] = deep[fa[p]]+1; //定义p点深度(其父亲+1)
    	  for (int a = first[p]; a; a = edge[a].next)
    	  { //遍历与p点相连的所有节点
    	  	int b = edge[a].to; //p通过与其相连的某一条边所到的点(懒得打于是用一个变量代替)
    	  	  if (b == fa[p]) continue; //如果不小心连到了p的父亲节点 不处理 继续下一个点
    	  	fa[b] = p; //在要dfs前确定下个节点的父亲节点 如果放外面内存要翻上几番
    		dfs1(b);
    		size[p]+=size[b]; //统计当前节点的子节点个数
    	  	  if (size[b] > size[son[p]]/* || !son[p](可省略 因为前一条已经包括了)*/) son[p] = b;
    	  } //(上一行)如果 p的子节点b的子节点  大于  p的原来的重儿子 || 没有设置过重节点(可省略 见下行解释)
    }           //因为没有设置时son[p]为0 size[0]初始定义为0 size[b]由于深搜出来肯定大于0 故
    
    
    void dfs2(int p,int father) //p 当前节点 father 当前节点所在链的起点
    { //第二次dfs求出每个节点所在链的起点(见后面)
    	top[p] = father; //将当前节点的链起点记作father
    	  if (!son[p]) return; //如果p是当前重链的链尾了则跳出去 接到上一层循环里
    	dfs2(son[p],father); //将同一重链上的点的起点father记好
    	  for (int a = first[p]; a; a = edge[a].next)
    	  { //遍历与p点相连的所有节点
    	  	int b = edge[a].to; //p通过与其相连的某一条边所到的点(懒得打于是也用同一个变量代替)
    	  	//(下行)如果b不是p的重子节点 & 不是p的父亲节点 则把其顶点设为自己 递归新的重链
    	  	  if (b != son[p] && b != fa[p]) dfs2(b,b);
    	  }    //(上行补充)新的重链就是在找到轻链以后从它的顶点继续找下去 一定全都能搜到
    }
    
    
    int main()
    {
    	int n,m,g,i,j;
    	scanf("%d%d%d",&n,&m,&g);
    	  for (int a = 1; a < n; a++)
    	  { //此处输入连接两节点的边 邻接表存无向图 此处不用邻接多重表
    	  	scanf("%d%d",&i,&j);
    	  	add(i,j);
    		add(j,i); //重点
    	  }
    	dfs1(g);    //第一次深搜
    	dfs2(g,g); //第二次深搜
    	  for (int a = 1; a <= m; a++)
    	  { //此处查询 i 和 j 的 最近公共祖先
    	  	scanf("%d%d",&i,&j);
    	  	  while (top[i] != top[j]) //如果 i 和 j 各自链的起点不同 则
    	  	  { //判断 i 和 j 各自链的起点深度 深度不同时先修改深的
    	  	    if (deep[top[i]] < deep[top[j]]) j = fa[top[j]];
    	  	    else i = fa[top[i]]; //把要修改的节点的顶点接到该点父亲节点的顶点上(可能意思不太对)
    	  	  } //一次只能修改一个 不然两个一起修改两点可能擦肩而过
    	  	  if (deep[i] > deep[j]) printf("%d\n",j);
    	  	  else printf("%d\n",i);
    	  } //两点此时都在同一链上 此时因为是找最近公共祖先 就把深度较小的点输出
    	return 0; //(上行解释) 因为深度较大的点还要向上 才能和深度较小的点相遇
    }

     

    大概就是这样子啦 OvO

     

    过模板题用了1344ms 还是比较慢的=-=

    然后乱加优化

    #define r register
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    const int MAX=1 << 19;
    struct Edge
    {
    	int to,next;
    }edge[MAX << 1];
    int fa[MAX],top[MAX],deep[MAX],size[MAX],son[MAX],first[MAX],tot;
    inline void read(int &x)
    {
        char q = getchar();x = 0;
        	while (q < '0' || q > '9') q = getchar();
        	while (q <= '9' && q >= '0')
    	x = (x << 1) + (x << 3) + q - (3 << 4), q = getchar();
    }
    void writeln(int x)  
    {
        tot = 0; char q[8];
        	while (x) q[++tot] = (x%10) + (3 << 4), x /= 10;
        	while (tot) putchar(q[tot--]);
        putchar('\n'); 
    }
    void add(r int x,r int y)
    {
        edge[++tot].to = y;
        edge[tot].next = first[x];
        first[x] = tot;
    }
    void dfs1(int p)
    {
        ++size[p];deep[p] = deep[fa[p]]+1;
        	for (r int a = first[p]; a; a = edge[a].next)
        	{
          		r int b = edge[a].to;
          		if (b == fa[p]) continue;
          		fa[b] = p;dfs1(b);size[p]+=size[b];
          		if (size[b] > size[son[p]]) son[p] = b;
        	}
    }
    void dfs2(int p,int father)
    {
        top[p] = father;
        	if (son[p]) dfs2(son[p],father);
        	for (r int a = first[p]; a; a = edge[a].next)
        	{
        		r int b = edge[a].to;
        		if (b != son[p] && b != fa[p]) dfs2(b,b);
        	}
    }
    int main()
    {
        r int i,j,m;
        int n,g;
        read(n);read(m);read(g);
        	for (r int a = 1; a < n; a++)
        	{
        		read(i);read(j);
        		add(i,j);add(j,i);
        	}
        dfs1(g);
        dfs2(g,g);
          while (m--)
          {
          	read(i);read(j);
          		while (top[i] != top[j])
    				if (deep[top[i]] < deep[top[j]]) j = fa[top[j]];
          			else i = fa[top[i]];
          		if (deep[i] > deep[j]) writeln(j);
          		else writeln(i);
          }
        return 0;
    }

    1140ms =-=

    展开全文
  • 华为桌面云教学 使user用户具有管理的所有权限 链接克隆模板
  • 模板

    2018-09-01 22:24:16
    模板 泛型编程 特点: 通用 灵活 函数模板 模板函数不是一个单独的函数,时编译器生成代码的规则 格式: //例子说明: template&lt;class T&gt;//template关键字用来创建模板,其中T...
  • 但项目组明确给出了上线速度,而且时间很快,这说明维基团队在确定上线平台前,已经进行了充分准备。我们甚至推测,维基的产品开发很可能已经完成了很大一部分。 除此之外,我们还看到狗狗币会长、《如何投资...
  • 函数模板

    2018-10-23 13:16:58
    文章目录函数模板1,函数模板的定义2,函数模板的实例化3,模板参数4,函数模板重载5,对于函数模板的一些常见问题: 1,函数模板的定义 函数模板实际上是建立一个通用函数,其函数类型和形参类型中的全部或部分...
  • C++模板:函数模板

    万次阅读 2018-09-10 23:40:52
    函数模板: 函数模板: 我们看这段代码,compare是一个函数名还是一个模板名?其实他是一个模板名。如果要把他看成一函数来使用,就要用一个类型来实例化这个模板,在使用时可以给其后尖括号中加上要使用的...
  • 模板三种类模板参数

    千次阅读 2018-04-22 10:40:47
    实际上有三种类型模板参数:类型模板参数、模板模板参数(以模板作为模板的参数)、无类型模板参数。 &nbsp; 1、类型模板参数 类型模板参数是我们使用模板的主要目的。我们可以定义多个类型模板参数: tem...
  • C++模板编程 -- 类模板

    2019-09-10 20:31:53
    文章目录概述带默认模板实参的情形 (Default Template Arguments)特化与偏特化偏特化 (Partial Specialization)特化 (Specializations)写模板一定会过的坎 -- 链接错误 概述 C++中使用类模板一般的格式是: template...
  • Word文档模板替换

    2019-11-15 12:22:37
    我的模板 链接:下载 准备自己需要的模板 里面的内容你可以自己定义 另存为宏文件 ...将模板名称改为Normal.然后分别存入“启用宏的word模板”...复制之前请确定你的Word是关闭的 新建Word,查看效果 ...
  • 函数模板和类模板的区别

    千次阅读 2017-07-18 23:16:42
    转自:函数模板与类模板有什么区别? 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定,即函数模板允许隐式调用和显式调用而类模板只能显示调用 。...
  • 要最终确定地图,您需要执行以下任一操作: 将每个Google表格标签下载为CSV文件,然后上传到GitHub存储库中的csv子文件夹中或者 获取您自己的Google Sheets API密钥以插入google-doc-url.js 请参阅教程中的步骤G或...
  • 模板
  • C++函数模板与类模板的区别

    万次阅读 多人点赞 2018-07-18 16:54:55
    模板: C++ 除了支持函数模板,还支持类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数...
  • C++模板进阶1.非类型模板参数 1.非类型模板参数 模板参数分为类类型形参和非类型形参。 类类型参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称,比如int,char,string等,也可以是自己实现的...
  • 目录非类型模板参数模板的特化 非类型模板参数 模板的参数分为两种,一种是非类型参数,一种是类型参数。 类型参数:则是我们通常使用的方式,就是在模板的参数列表中在class后面加上参数的类型名称。 非类型参数:...
  • 模板模板

    2014-06-07 15:39:26
    1.类模板模板类的概念 ... 如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。
  • 8 深入模板基础 8.1 参数化声明 8.1.1 虚成员函数 8.1.2 模板的链接 8.2 模板参数 8.2.1 类型参数 8.2.2 非类型参数 8.2.3 模板模板参数 8.2.4 缺省模板实参 8.3 模板实参 8.3.1 函数模板实参 8.3.2 ...
  • 模板

    千次阅读 2018-09-05 10:55:31
    C++中有一个重要特性,那就是模板类型。类似于Objective-C中的泛型。C++通过类模板来实现泛型支持。 1 基础的类模板模板,可以定义相同的操作,拥有不同数据类型的成员属性。 通常使用template来声明。告诉...
  • 精美的ppt模板

    2013-09-18 11:08:23
    您只需经过选择演示文稿类型、确定输出类型(屏幕输出、Web演示文稿等)和输入演示文稿选项几个步骤,就可以在“幻灯片”选项卡中看到符合特定任务要求的一系列模板。您只要逐个选中模板中的幻灯片,根据需要插入...
  • C++模板编程

    2016-11-13 15:02:53
    当一般函数与函数模板同名时,编译器不会报错(函数模板只有在类型T确定之后才会生成对应的函数体,否则它仅仅只是模板。)。当出现函数调用时,优先匹配一般函数。 double Max(double a,double b) //一般函数 { ...
  • 模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义...
  • 软件开发合同模板范本

    万次阅读 2018-08-23 10:17:48
    其它《软件开发合同模板范本》下载链接: https://download.csdn.net/download/daqiang012/10621400 合同编号:_________甲方(委托人):_________ 法定住址:_________ 法定代表人:_________ 职务:________...
  • Django模板语言

    2019-01-07 15:42:11
    1.3、优点: 模板的设计实现了业务逻辑与现实内容的分离 ; 视图可以使用任何模板 1.4、模板处理 : 加载 ; 渲染 二、常用语法 2.1、只需要记两种特殊符号: {{ }}和 {% %} , 变量相关的...
  • WordPress中的模板文件其实是一个单一的PHP文件,用于确定网站前端显示的特定页面。它们可以包括HTML,PHP和WordPress中的PHP函数。 WordPress对这些模板文件有特殊的命名约定,因此所有的主题,在后端都共享一个...
  • 模板笔记007 - 声明 形参 实参声明 类模板和函数模板是c++的两种基本类型的模板 模板的声明需要引入一个参数化子句:template 联合模板也是类模板的一种 和普通的函数一样,模板函数也可以有缺省参数 template ...
  • 【C++】模板

    2019-11-16 21:16:08
    本篇从函数模板、类模板、非类型模板参数、模板的分离编译、模板的优缺点五个方面进行知识的简单梳理。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,371
精华内容 46,548
关键字:

如何确定模板链