3.1.2 函数模版与类模版

一、函数模版

比较两个数的大小。

代码:

#include <iostream>
using namespace std;

template <typename T>
inline int myCompare(const T &a, const T &b) {
    if(a > b) return 1;
    else if(a < b) return -1;
    else return 0;
}

int main() {
    cout << myCompare(1, 0) << endl;
    cout << myCompare(1.0, 2.0) << endl;
    cout << myCompare(1.0f, 1.0f) << endl;
    return 0;
}

二、类模版

用c++中的类模版来实现标准函数库中的队列

代码:

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

template <typename T> queue;
template <typename T>
class queueItem {
private:
    friend class queue<T>;
    queueItem<T> (const T &i) : item(i), next(0) {}
    T item;
    queueItem *next;
};

template <typename T>
class queue{
public:
    queue() : head(0), tail(0), n(0) {};
    queue& operator=(const queue &q);
    queue(const queue &q);
    ~queue();
    void push(const T &i);
    void pop();
    T front();
    T back();
    bool empty() {
        if(n > 0) return false;
        else return true;
    }
    size_t size() {
        return n;
    }
    void claer();
private:
    size_t n;
    queueItem<T> *head;
    queueItem<T> *tail;
    void copy_queue(const queue &q);
}

template <typename T>
void queue<T>::push(const T &i) {
    queueItem<T> *temp = new queueItem<T>(i);
    if(n == 0) {
        head = tail = temp;
    }
    else {
        tail -> next = temp;
        tail = temp;
    }
    n++;
}

template <typename T>
void queue<T>::pop() {
    if(n > 0) {
        queueItem<T> *temp = head;
        head = head -> next;
        delete temp;
        n--;
    }
}

template <typename T>
T queue<T>::front() {
    if(n > 0) return head->item;
    return NULL;
}

template <typename T>
T queue<T>::back() {
    if(n > 0) return tail->item;
    return NULL;
}

template <typename T>
void queue<T>::claer() {
    while(n > 0) {
        pop();
    }
}

template <typename T>
void queue<T>::~queue() {
    claer();
}

template <typename T>
queue<T>::queue(const queue &q) : head(0), tail(0), n(0) {
    copy_queue(q);
}

template <typename T>
queue<T> queue<T>::operator=(const queue &q) {
    if(this != &q) {
        n = 0;
        claer();
        copy_queue(q);
    }
    return *this;
}

template <typename T>
void queue<T>::copy_queue(const queue &q) {
    queueItem<T> *temp = q.head;
    while(temp) {
        push(temp->item);
        temp = temp->next;
    }
}
时间: 2024-11-10 08:20:36

3.1.2 函数模版与类模版的相关文章

c++ 类模版、成员函数模版、函数模版 用法

C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 template <class T>//类模版 class CTemplate{ public: void SWap(T &first, T &second){ } }; #include <iostream> class Single{ public: static Single

C++ 类模板二(类模版与友元函数)

//类模版与友元函数 #include<iostream> using namespace std; template<typename T> class Complex{ public: Complex(T a,T b); void Print() const//const修饰的是this指针 { cout << this->Real << ":" <<this->Image<< endl; } /*

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

初探C++类模版学习笔记

类模板 实现:在定义类的时候给它一个或多个参数,这个些参数表示不同的数据类型.                              -->抽象的类. 在调用类模板时, 指定参数, 由编译系统根据参数提供的数据类型自动产生相应的模板类                   -->具体的类. 类模板的定义 C++的类模板的写法如下: template <类型参数表> //类型参数表的写法就是:class 类型参数1, class 类型参数2, - class 类模板名 { 成员函数

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

spring jdbc查询 依赖JdbcTemplate这个类模版封装JDBC的操作

1 package cn.itcast.spring.jdbc; 2 3 import java.util.List; 4 5 import org.springframework.jdbc.core.support.JdbcDaoSupport; 6 7 public class PersonDao extends JdbcDaoSupport{ 8 public void update(){ 9 this.getJdbcTemplate().execute("update person se

类模版静态成员初始化

首先看代码,静态数据成员分为两种情况,第一种不依赖模版类型参数,第二种依赖模版类型参数. template <typename T> class TestTemStatic { public: static int knownTypeVar; static T unKnownTypeVar; }; 那么如何初始化呢? 对于第一种存在两种初始化方式: template <> int TestTemStatic<int/* any other type */>::known

Django的模版引擎与模版使用

Django的模版引擎与模版使用 模版引擎是模版响应的后端.模版指的是HTML.css,js等相关的文件.模版引擎是将这些表示层文件与数据相整合在一起,然后将整合后的数据给到响应类型判断采用一次性响应还是流响应,确定响应类型后将模版加工后的数据反馈给用户. Django支持两种模板引擎,Django模版引擎和Jinja2模版引擎.在settings.py文件中对模版引擎进行配置(BACKEND).模版目录在列表中的顺序是搜索模版的顺序. 文件中是这样写的: TEMPLATES = [ { 'BA

【C++缺省函数】 空类默认产生的6个类成员函数

1.缺省构造函数. 2.缺省拷贝构造函数. 3. 缺省析构函数. 4.缺省赋值运算符. 5.缺省取址运算符. 6. 缺省取址运算符 const. <span style="font-size:18px;"> class A { public: A(){}//缺省构造函数 A(const A&){}//拷贝构造函数 ~A(){}//析构函数 A&operator=(const A&){}//赋值运算符 A*operator&(){}//取址运算