【C++】模版的概念、使用方法和深入了解

模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。

模板函数

假设现在要实现一个比较两个数是否相等的重载函数。

bool IsEqual (int left, int right)
{
     return left == right;
}

bool IsEqual (const string& left , const string& right)
{
     return left == right;
}

void test1 ()
{
     string s1 ("s1"), s2("s2");
     cout<<IsEqual (s1, s2)<<endl;
     cout<<IsEqual (1,1)<<endl;
}

从代码可以看出,如果我们要比较int和char类型需要分别编写程序来解决这两个问题,所以代码的重复度就会很高,所以C++中就引入了模版来解决这个问题。

模板形参的定义既可以使用class,也可以使用typename,含义是相同的。上面的问题就可以简化为如下的代码:

template<class T>
bool IsEqual(const T& left, const T& right)
{
    return left == right;
}

void test1 ()
{
     string s1 ("s1"), s2("s2" );
     cout<<IsEqual (s1, s2)<<endl ;
     cout<<IsEqual (1,1)<<endl;
}

对于T的类型,编译器自己会通过推演得到T的类型,从而做出应有的处理。

在这,重点分享下模版的深入知识。

template<typename T>
class SeqList
{
public:
    SeqList()
        :_array(NULL)
        , _size(0)
        , _capacity(0)
    {}
    
    ~SeqList()
    {
        if (_array)
        {
            delete[] _array;
        }
    }

    SeqList(const SeqList<T>& s)
    {
        _array = new T[s._size];
        //memcpy(_array, s._array, sizeof(T)*s._size);

        for (size_t i = 0; i < s._size; i++)//根据size的大小来,原空间多大,同样拷贝多大的空间
        {
            _array[i] = s._array[i];
        }

        _size = s._size;
        _capacity = s._capacity;
    }

    SeqList<T>& operator=(SeqList<T> s)
    {
        swap(_array, s._array);
        swap(_size, s._size);
        swap(_capacity, s._capacity);

        return *this;
    }

    void PushBack(const T& x)
    {
        _CheckCapacity();
        _array[_size++] = x;
    }

    void Print()
    {
        for (int i = 0; i < _size; ++i)
        {
            cout << _array[i] << " ";
        }
        cout << endl;
    }

    void Reserve(size_t x)
    {
        _CheckCapacity(x);
    }

    T& operator[](size_t index)
    {
        assert(index < _size);

        return _array[index];//如果不用引用,那么传过来的是一块临时空间,只是将临时空间的值给覆盖了,如果使用引用那么就是把对应的空间给出来,赋值的时候直接在原基础上改动
    }
    
protected:
    void _CheckCapacity(size_t n)
    {
        if (n > _capacity)
        {
            _capacity = 2 * _capacity + 3 > n ? 2 * _capacity + 3 : n;
            /*_array = (T*)realloc(_array, sizeof(T)*_capacity);*/

            T* tmp = new T[_capacity];
            if (_array)
                /*memcpy(tmp, _array, sizeof(T)*_size);*/ 
            for (size_t i = 0; i < _size; i++)
            {
                tmp[i] = _array[i];
            }

            delete[] _array;
            _array = tmp;
        }
    }

private:
    T* _array;
    size_t _size;
    size_t _capacity;
};

//template<typename T>  //在模版内声明,在模版外定义与C++代码写顺序表的区别
//void SeqList<T>::PushBack(const T& x)//作用域要写类型名,而不是类名
//{
//    
//}

void test1()
{
    SeqList<int>s1;
    s1.PushBack(1);
    s1.PushBack(2);
    s1.PushBack(3);
    s1.PushBack(4);

    s1.Print();

    SeqList<string> s2;
    s2.PushBack("xxx");
    s2.PushBack("xxx");
    s2.PushBack("xxx");
    s2.PushBack("xxx");
    s2.PushBack("xxx");

    s2.Print();

    SeqList<string> s3(s2);
    s3.Print();

    SeqList<string> s4;
    s4.PushBack("yyy");

    s4 = s3;
    s4.Print();
    //string* p1 = (string*)malloc(sizeof(string));//指向的是字符串类,字符串类里面不仅仅只包含了字符串指针,还有_size,_capacity等内容
    //string* p2 = new string;

    //*p1 = "sss";
    //*p2 = "sss";

}

int main()
{
    test1();
    system("pause");
    return 0;
}
时间: 2024-10-14 10:27:46

【C++】模版的概念、使用方法和深入了解的相关文章

递归函数的概念使用方法与实例

一.栈     在说函数递归的时候,顺便说一下栈的概念.     栈是一个后进先出的压入(push)和弹出(pop)式数据结构.在程序运行时,系统每次向栈中压入一个对象,然后栈指针向下移动一个位置.当系统从栈中弹出一个对象时,近期进栈的对象将被弹出.然后栈指针向上移动一个位置.程序猿常常利用栈这种数据结构来处理那些最适合用后进先出逻辑来描写叙述的编程问题.这里讨论的程序中的栈在每一个程序中都是存在的,它不须要程序猿编写代码去维护,而是由运行是系统自己主动处理.所谓的系统自己主动维护,实际上就是编

概要设计、详细设计(一)概念、方法、实践步骤

1.    概念.方法.实践步骤 设计是指根据需求开发的结果,对产品的技术实现由粗到细进行设计的过程.根据设计粒度和目的的不同可以将设计分为概要设计.详细设计等阶段以便于管理和确保质量.设计内容也要根据软件系统的实际情况进行定义,比如对于交互性要求高的系统可以有视觉设计等等. 一般来说可以将设计阶段划分为概要设计.详细设计2阶段进行管理,程序设计可以结合项目管理.作业配分.开发团队的能力以及质量要求等因素来决定是否作为单独的阶段进行管理. n  概要设计: 定义实现需求的工作产品技功能.技术构架

atitit.提升软件开发的效率and 质量的那些强大概念and方法总结

atitit.提升软件开发的效率and 质量的那些强大概念and方法总结 1. 主流编程中三个最糟糕的问题 1 1.1. 从理解问题后到实现的时间很长 1 1.2. 理解和维护代码  2 1.3. 学习曲线高  2 1.4. 扩展性烂 2 1. Coc 2 2. Dsl 2 3. DSM 3 4. 4gl 3 5. 产生式编程(Generative Programming,GP) 3 5.1. 为重用而开发以及使用重用的开发 3 6. 在模型驱动开发(MDD)介绍MDA 4 7. ·  元编程

sizeof的概念,使用方法及主要用途

解析C语言中的sizeof 一.sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. 二.sizeof的使用方法   1.用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住.如sizeof(int). 2.用于变量 sizeof使用形式:sizeof(var_name)或s

【读书笔记-数据挖掘概念与技术】挖掘频繁模式、关联和相关性:基本概念和方法

频繁模式:频繁出现的模式(可以是项集.子序列或子结构) 基本概念 支持度:support 置信度:confidence 关联规则:association 找出所有的频繁项集:出现次数≥最小支持计数 由频繁项集产生强关联的规则(定义最小支持度和最小置信度) 频度(支持度计数):出现的次数 频繁项集:项集I的相对支持度满足预定义的最小支持度阈值 闭频繁项集:不存在真超项集Y使得Y与X在D中具有相同的支持度计数 X是D中的极大频繁项集:X是D中的极大频繁项集或极大项集,如果X是频繁的,并且不存在超项集

Java编程思想(十七) —— 并发之基本概念和方法

先提前写并发这一块,前面的数组,IO,泛型,注解是知识点很多很小的东西,放到后面写. 确实如书上所说,学到这里都是顺序编程,程序所有事物任意时刻只能执行一个步骤.这远远不够,想想双11淘宝技术如果并发不牛叉的话根本处理不了这么 庞大的数据量.--<淘宝技术这十年>.技术的积累真的是很深. 作者介绍的时候最后很有趣说,学会这章之后很容易变得过分自信,如果要学好,还需要继续深入. 1)基本的线程机制 进程有3种状态,运行,就绪,阻塞. 线程有4种状态,运行,就绪,阻塞和终止.网上还有其他分法. 所

技术梳理:rest的概念和方法

原文链接:http://www.cnblogs.com/loveis715/p/4669091.html REST简介 一说到REST,我想大家的第一反应就是"啊,就是那种前后台通信方式."但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. 在您将看到的这一篇文章中,我们将对REST,尤其是基于HTTP的REST服务进行详细地介绍.通过这些文章,您不仅可以了解到什么是REST,更能清晰地了解到您在编写RES

Date类型常用概念及方法总结(1)

Date类型使用UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数来保存时间. (1)创建当前日期 调用Date不传递参数的情况下,创建的新对象自动获得当前日期和时间(本地时区). var now=new Date(); (2)创建特定的日期和时间 如果要创建特定的日期对象,必须传入表示该日期的毫秒数(即从UTC时间1970年1月1日至该日期的毫秒数).为简化这一过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC(): var time1=new Da

集训第六周 数学概念与方法 数论 筛素数 G题

Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识.  问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数.  给定一个区间,你能计算出这个区间内有多少个美素数吗? Input 第一行输入一个正整数T,表示总共有T组数据(T <= 10000). 接下来共T行,每行输入两个整数L,R(1<= L <= R <= 10