(九)C++基础 模板

一、目的和要求

1.掌握函数模板的声明及模板函数的生成
2.掌握类模板的使用方法

二、具体内容

1.实现下列功能。
1)定义学生类包含姓名和成绩两个数据成员,重载比较运算符(按成绩和按姓名两个模式比较)和输出运算符。

2)实现greater_than函数模板,用于比较两个对象的大小,如果a>b,返回true,否则返回fasle。(注意字符串的比较需要将函数模板特化)

3)实现less_than函数模板,用于比较两个对象的大小,如果a<b,返回true,否则返回fasle。(注意字符串的比较需要将函数模板特化)
4)实现Print函数模板,用于打印一维数组。

5)实现冒泡排序(也可以使用其它排序算法,自己喜欢就好了)的函数模板,输入参数是数组、数组大小和用于比较的数组元素的函数指针。

#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;

class Student {
public:
    enum SortType { BY_NAME, BY_SCORE };
    static SortType sort_type;
    Student (string name, int score) :name_ (name), score_ (score) {
        name_ = name;
        score_ = score;
    }
    bool operator > (const Student& rhs) {
        switch (sort_type)
        {
        case Student::BY_NAME:
            if (rhs.name_ > this->name_) {
                return true;
            }
            else {
                return false;
            }
            break;
        case Student::BY_SCORE:
            if (rhs.score_ > this->score_) {
                return true;
            }
            else {
                return false;
            }
            break;
        default:
            break;
        }
    }
    bool operator < (const Student& rhs) {
        switch (sort_type)
        {
        case Student::BY_NAME:
            if (rhs.name_ < this->name_) {
                return true;
            }
            else {
                return false;
            }
            break;
        case Student::BY_SCORE:
            if (rhs.score_ < this->score_) {
                return true;
            }
            else {
                return false;
            }
            break;
        default:
            break;
        }
    }
    friend ostream& operator << (ostream& os, Student& student) {
        os << student.name_ << " " << student.score_;
        return os;
    }
private:
    string name_;
    int score_;
};

Student::SortType Student::sort_type = Student::BY_NAME;

template<class T>
bool greater_than (T a, T b) {
    return a > b ? true : false;
}

template<class T>
bool less_than (T a, T b) {
    return a < b ? true : false;
}

template<class T>
void Print (T arr[], int len) {
    for (int i = 0; i < len; i++) {
        cout << arr[i]<<" ";
    }
    cout << endl;
}
template<class T>
void bubble_sort (T arr[], int len, bool (*compare)(T&, T&)) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if ((*compare)(arr[j], arr[j + 1])) {
                swap (arr[j], arr[j + 1]);
            }
        }
    }
}

int main () {
    int int_array[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
    int len = (int) sizeof (int_array) / sizeof (*int_array);
    cout << "origin int array:" << endl;
    Print (int_array, len);
    bubble_sort (int_array, len, greater_than);
    cout << "sort: ascending order:" << endl;
    Print (int_array, len);
    bubble_sort (int_array, len, less_than);
    cout << "sort: descending order:" << endl;
    Print (int_array, len);

    cout << "\n----------华丽的分割线 666-----------------\n" << endl;

    float float_array[] = { 17.5f, 19.1f, 0.6f, 1.9f, 10.5f, 12.4f, 3.8f, 19.7f, 1.5f, 25.4f, 28.6f, 4.4f, 23.8f, 5.4f };
    len = (int) sizeof (float_array) / sizeof (*float_array);
    cout << "origin float array:" << endl;
    Print (float_array, len);
    bubble_sort (float_array, len, greater_than);
    cout << "sort: ascending order:" << endl;
    Print (float_array, len);
    bubble_sort (float_array, len, less_than);
    cout << "sort: descending order:" << endl;
    Print (float_array, len);

    //cout << "\n----------华丽的分割线 666-----------------\n" << endl;  

    //注释部分是关于C语言的字符串比较,需要重载模板函数,有兴趣可以做,没兴趣就当注释。  
    /*const char* const_char_array[] = { "ye", "meng", "jie" };
    len = (int) sizeof(const_char_array) / sizeof(*const_char_array);
    cout << "origin float array:" << endl;
    Print(const_char_array, len);
    bubble_sort(const_char_array, len, greater_than);
    cout << "sort: ascending order:" << endl;
    Print(const_char_array, len);
    bubble_sort(const_char_array, len, less_than);
    cout << "sort: descending order:" << endl;
    Print(const_char_array, len);*/

    cout << "\n----------华丽的分割线 666-----------------\n" << endl;

    Student student_array[] = { Student ("ye",100), Student ("meng",60), Student ("jie",70) };
    len = (int) sizeof (student_array) / sizeof (*student_array);
    //sort by name  
    cout << "sort student object by name------" << endl;
    Student::sort_type = Student::BY_NAME;
    cout << "origin student array:" << endl;
    Print (student_array, len);
    bubble_sort (student_array, len, greater_than);
    cout << "sort by name: ascending order:" << endl;
    Print (student_array, len);
    bubble_sort (student_array, len, less_than);
    cout << "sort by name: descending order:" << endl;
    Print (student_array, len);

    cout << "\n----------华丽的分割线 666-----------------\n" << endl;

    //sort by score  
    cout << "sort student object by score------" << endl;
    Student::sort_type = Student::BY_SCORE;
    cout << "origin student array:" << endl;
    Print (student_array, len);
    bubble_sort (student_array, len, greater_than);
    cout << "sort by score: ascending order:" << endl;
    Print (student_array, len);
    bubble_sort (student_array, len, less_than);
    cout << "sort by score: descending order:" << endl;
    Print (student_array, len);
    return 0;
}

运行结果:
在这里插入图片描述

2.实现一个动态数组类模板。

#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;

template<class T>
class DynamicArray
{
public:
    //默认构造函数,可以设置数组容量为1, 数组长度为0  
    DynamicArray ()
    {
        capacity_ = 1;
        size_ = 0;
        data_ = new T[capacity_];
    }
    //给定数组长度构造动态数组  
    DynamicArray (size_t capacity)
    {
        capacity_ = capacity;
        size_ = 0;
        data_ = new T[capacity_];
        //to do list   
    }
    //从数组中构造动态数组  
    DynamicArray (T arr[], size_t size)
    {
        size_ = size;
        capacity_ = arr.capacity_;
        data_ = new T[capacity_];
        for (int i = 0; i < size_; i++) {
            data_[i] = arr.data_[i];
        }
        //to do list    
    }
    //拷贝构造函数  
    DynamicArray (const DynamicArray& rhs)
    {
        size_ = rhs.size_;
        capacity_ = rhs.data_;
        data_ = new T[capacity_];
        for (int i = 0; i < size_; i++) {
            data_[i] = rhs.data_[i];
        }
        //to do list    
    }

    //复制运算符  
    DynamicArray& operator=(const DynamicArray& arr)
    {
        if (data_ != NULL) {
            delete[] data_;
            data_ = NULL;
        }
        size_ = arr.size_;
        capacity_ = arr.capacity_;
        data_ = new T[arr.capacity_];
        for (int i = 0; i < size_; i++)
        {
            data_[i] = arr.data_[i];
        }
        return *this;
        //to do list  
    }
    //析构函数,释放内存  
    ~DynamicArray ()
    {
        delete[] data_;
        //to do list  
    }
    //检查动态数组容量,如果数组长度>=数组容量,重新分配内存空间,并将原始数据复制到新空间,通常新的容量是原来的容量的2倍  
    void check_capacity ()
    {
        if (size_ >= capacity_) {
            capacity_ = capacity_ * 2;
        }
        //to do list    
    }
    //数组末尾添加一个元素,添加元素之前应该检查数组容量是否足够  
    void push_back (const T& item)
    {
        if (capacity_ <= size_) {
            return;
        }
        data_[size_] = item;
        size_++;
        //to do list   
    }
    //删除最后一个元素,只需将数组长度减一即可
    void pop_back ()
    {
        if (size_ == 0) {
            return;
        }
        size_--;
        //to do list  
    }
    //在pos位置插入元素,插入元素之前应该检查数组容量是否足够  
    void insert (size_t pos, const T& item)
    {
        if (capacity_ <= size_) {
            return;
        }
        if (pos<0 || pos>size_) {
            pos = size_;
        }
        for (int i = size_; i >= pos; i--) {
            data_[i + 1] = data_[i];
        }
        data_[pos] = item;
        size_++;
        //to do list  
    }
    //返回数组长度
    size_t size () const
    {
        return size_;
    }
    //返回数组容量 
    size_t capacity () const
    {
        return capacity_;
    }
    //下标运算符重载[],返回pos位置的元素 
    T& operator[](size_t pos)
    {
        return data_[pos];
        //to do list  
    }
  
    void Print () const{
        for (int i = 0; i < size_; i++)
        {
            cout << data_[i] << " ";
        }
        cout << endl;
    }

private:
    T* data_; //数据指针  
    size_t capacity_; //动态数组容量  
    size_t size_; //动态数组长度  
};

int main () {
    DynamicArray<int> a(10);
    int b = 7,c = 8,d = 6,e = 5;
    cout << "添加:"  << endl;
    a.push_back (b);
    a.Print ();
    a.push_back (c);
    a.Print ();
    a.push_back (d);
    a.Print ();
    a.push_back (e);
    a.Print ();
    cout << endl;
    cout << "删除:" << endl;
    a.pop_back ();
    a.Print ();
    cout << endl;
    cout << "插入:" << endl;
    a.insert (3, e);
    a.Print ();
    a.insert (2, b);
    a.Print ();
    return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值