C++ 实验5(大一下)

实验5:运算符重载与模板类

姓名_____________班级_____________学号______________

  • 请阅读此说明:实验5满分100分;做完实验后请按要求将代码和截图贴入该文档。然后将此文档、源代码文件(.hpp, .cpp)打包上传到学习通。

1、(总分100分)在实验4的基础上工作:(20分)❶考虑将myVector类调整为模板类,注意体会模板类和非模板类在程序设计和装配时的差异;(30分)实例化一个myVector<myString>的字符串向量类型 ,并按测试程序的要求调整myString的设计 通过测试程序,注意体会模板类实例化的方法和实例化类使用的特点;(30分)尝试用该类型写一个主函数完成一个基于选择排序的字符串降序排列工作,注意比较和直接使用myVector内的sort有什么不同?(20分)若字符串集合的排序要求为按照字符串的第2个字符至第6个字符构成的子串来完成降序排序(假设每个原始字符串长度都超过10),则考虑你的程序该做怎么样的调整?

实验解答:

黏贴模板类myVector的实现代码和调整后的myString的定义代码:

//"myVector.h" 模板类

#pragma once

#include <iostream>

#include <algorithm>

using namespace std;

const int CAPACITY = 1000;

template <class T>

class myVector

{

public:

    //构造

    myVector();

    myVector(int);

    myVector(int, const T);   //用指定值value初始化n个单元,n<=CAPACITY

    myVector(const myVector&);     //拷贝构造

    //重载

    myVector& operator=(const myVector& right); //赋值重载

    T& operator[](int);   //重载下标运算

    myVector& operator-();    //元素逆置

    myVector& operator++();        //前置自增,vector内每个单元值+1

    myVector& operator++(int); //后置自增

    friend myVector operator+(const myVector& left, const myVector& right);    //求两个数组并集

    friend myVector operator-(const myVector& left, const myVector& right);    //求两个数组差集

    friend ostream& operator<<(ostream&, const myVector&);   //输出流重载

    friend istream& operator>>(istream&, myVector&); //输入流重载

    void display() const;     //从0开始显示向量元素,以逗号分隔每个单元值

    void mysort();                 //升序排序

    void set_size(int);       // newsize < CAPACITY

    int get_size() const;     //获取size

private:

    T data[CAPACITY];

    int size;         //有效单元个数

};

template<class T>

myVector<T>::myVector() : size(0) {}

template<class T>

myVector<T>::myVector(int n) : size(n)      //初始化 size 值为n 的myVector

{

    for (int i = 0; i < size; i++)

        data[i] = T();

}

template<class T>

myVector<T>::myVector(int n, const T value) : size(n)

{

    for (int i = 0; i < size; i++)

        data[i] = value;

}

template<class T>

myVector<T>::myVector(const myVector& right) : size(right.size)

{

    for (int i = 0; i < size; i++)

        data[i] = right.data[i];

}

template<class T>

myVector<T>& myVector<T>::operator =(const myVector& right)

{

    size = right.size;

    for (int i = 0; i < size; i++)

        data[i] = right.data[i];

    return *this;

}

template<class T>

T& myVector<T>::operator [](int index)

{

    if (index < size)

        return data[index];

    else return data[CAPACITY];

}

template<class T>

myVector<T>& myVector<T>::operator -()

{

    reverse(data, data + size);

    return *this;

}

template<class T>

myVector<T>& myVector<T>::operator ++()

{

    for (int i = 0; i < size; i++)

        data[i]++;

    return *this;

}

template<class T>

myVector<T>& myVector<T>::operator ++(int)

{

    myVector temp = *this;

    ++(*this);

    return temp;

}

template<class T>

myVector<T> operator +(const myVector<T>& left, const myVector<T>& right)

{

    myVector<T> result = left;

    for (int i = 0; i < right.size; i++)

    {

        bool duplicate = false;

        for (int j = 0; j < left.size; j++)

        {

            if (right.data[i] == left.data[j])

            {

                duplicate = true;

                break;

            }

        }

        if (!duplicate)

            result.data[result.size++] = right.data[i];

    }

    return result;

}

template<class T>

myVector<T> __cdecl operator -(const myVector<T>& left, const myVector<T>& right)   //求两个 Vector 差集

{

    myVector<T> result;

    for (int i = 0; i < left.size; i++)

    {

        bool duplicate = false;

        for (int j = 0; j < right.size; j++)

        {

            if (left.data[i] == right.data[j])

            {

                duplicate = true;

                break;

            }

        }

        if (!duplicate)

            result.data[result.size++] = left.data[i];

    }

    return result;

}

template<class T>

ostream& operator <<(ostream& out, const myVector<T>& v)

{

    for (int i = 0; i < v.size; i++)

    {

        out << v.data[i];

        if (i != v.size - 1)

            out << ",";

    }

    return out;

}

template<class T>

istream& operator >>(istream& in, myVector<T>& v)

{

    for (int i = 0; i < v.size; i++)

        in >> v.data[i];

    return in;

}

template<class T>

void myVector<T>::display() const

{

    for (int i = 0; i < size; i++)

    {

        cout << data[i];

        if (i != size - 1)

            cout << ",";

    }

    cout << endl;

}

template<class T>

void myVector<T>::mysort()

{

    sort(data, data + size);

}

template<class T>

void myVector<T>::set_size(int newsize)

{

    size = newsize > CAPACITY ? CAPACITY : newsize;

}

template<class T>

int myVector<T>::get_size() const

{

    return size;

}

//"myString.h"

#pragma once

class myString

{

public:

    myString()         // 无参数构造函数

    {

        message = NULL;

        length = 0;

    }

    myString(const char* s)   // 带参数构造函数

    {

        length = strlen(s);

        message = new char[length + 1];

        strcpy(message, s);

    }

    ~myString()        // 析构函数

    {

        delete[] message;

        message = NULL;

        length = 0;

    }

    int getLength()    // 获取字符串长度

    {

        return length;

    }

    friend ostream& operator<<(ostream& os, const myString& s// 重载<<运算符

    {

        os << s.message;

        return os;

    }

private:

    char* message;     // 存放字符串的字符数组指针

    int length;        // 字符串长度

};

黏贴程序测试运行结果窗口(运行结果截屏):

黏贴排序实现代码:

    for (int i = 0; i < aStrSet.get_size(); i++) {

        int max = i;

        for (int j = i + 1; j < aStrSet.get_size(); j++) {

            if (aStrSet[max] < aStrSet[j]) max = j;

        }

        char* temp = aStrSet[i];

        aStrSet[i] = aStrSet[max];

        aStrSet[max] = temp;

    }

黏贴基于子串比较规则的排序实现代码 以及你测试的数据和测试的结果(运行结果截屏);以及说明原来设计的类是否做了调整?若有调整,调整了什么?

  开一个新的myVector 对象存储子串,在对子串排序的同时对原串进行排序。

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值