东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1161|回复: 2
打印 上一主题 下一主题

[C/C++] 案例:数组模板类变容器,算法与数据类型分离

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14439
QQ
跳转到指定楼层
楼主
发表于 2021-6-29 17:27:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式





案例:数组模板类变容器,算法与数据类型分离


2_MyVector_test.cpp
  1. #include <iostream>
  2. #include <string.h>
  3. #include "2_MyVector.cpp"
  4. using namespace std;

  5. //案例:数组模板类变容器,算法与数据类型分离  放 int char Teacher 的数组 都可以

  6. class Teacher{
  7. public:
  8.     Teacher()
  9.         {
  10.         //error: no matching function for call to ‘Teacher::Teacher()’m_space = new T[m_len];
  11.         //为什么要提供一个 默认构造函数?
  12.                 this->age = 0;
  13.                 strcpy(this->name, "");
  14.         }
  15.     Teacher(char *name, int age=8){
  16.         this->age = age;
  17.         strcpy(this->name, name);
  18.         
  19.     }
  20. public:
  21.     void printT()
  22.         {
  23.                 cout << name << ", 年龄=" << age << endl;
  24.         }
  25. private:
  26.     int age;
  27.     char name[10];  //这种情况简单 直接分配栈内存空间
  28. };


  29. int main(){

  30.     Teacher t1("t1", 31),t2("t2", 32),t3("t3", 33),t4("t4", 34);
  31.    
  32.     MyVector<Teacher> myv1(4);
  33.     myv1[0] = t1;
  34.     myv1[1] = t2;
  35.     myv1[2] = t3;
  36.     myv1[3] = t4;

  37.     MyVector<Teacher> myv2(4);
  38.     myv2 = myv1;  // =操作符重载
  39.    
  40.     for(int i=0;i<4;i++){
  41.         myv2[i].printT();
  42.     }

  43.     // cout << myv2;

  44.     cout << "我的容器类_Teacher复杂数据类型" << endl;
  45.     return 0;
  46. }

  47. int main_char(){

  48.     MyVector<char> myv1(4);
  49.     myv1[0] = 'a';
  50.     myv1[1] = 'b';
  51.     myv1[2] = 'c';

  52.     MyVector<char> myv2(10);
  53.     myv2 = myv1;  // =操作符重载

  54.     for(int i=0;i<10;i++){
  55.         cout << myv2[i] << endl;
  56.     }

  57.     // cout << myv2;

  58.     cout << "我的容器类_char" << endl;
  59.     return 0;
  60. }


  61. int main_int(){

  62.     MyVector<int> myv1(10);
  63.     for(int i=0;i<10;i++){
  64.         myv1[i] = i*i;
  65.         // cout << myv1[i] << endl;
  66.     }
  67.     MyVector<int> myv2(10);
  68.     myv2 = myv1;  // =操作符重载

  69.     // for(int i=0;i<10;i++){
  70.     //     cout << myv2[i] << endl;
  71.     // }

  72.     // cout << myv2;

  73.     cout << "我的容器类_int" << endl;
  74.     return 0;
  75. }
复制代码




2_MyVector.cpp
  1. #include <iostream>
  2. #include "2_MyVector.h"

  3. using namespace std;



  4. //后面有“::”的名称一定是类名或命名空间名
  5. //error: invalid use of template-name ‘MyVector’ without an argument list
  6. template <typename T>
  7. MyVector<T>::MyVector(int size){
  8.     m_len = size;
  9.     m_space = new T[m_len];  // 这里会调用T的默认构造函数 如果T是复杂类型的话
  10.     std::cout << "构造函数!" << std::endl;
  11. }

  12. template <typename T>
  13. MyVector<T>::~MyVector(){
  14.     if(m_space != NULL){
  15.         delete [] m_space;
  16.         m_space=NULL;  //防止野指针
  17.         m_len = 0;
  18.     }
  19.     std::cout << "析构函数!" << std::endl;
  20. }


  21. template <typename T>
  22. T& MyVector<T>::operator[](int index){
  23.     //返回 T 这样只能当右值啊 不能当左值
  24.     //返回 T& 既可以当左值 也可以当右值
  25.     std::cout << "operator[]操作符重载!" << std::endl;
  26.     return m_space[index];
  27. }


  28. //实现 拷贝构造函数 MyVector<int> myv2 = myv1;   // 拷贝构造函数
  29. template <typename T>
  30. MyVector<T>::MyVector(const MyVector<T>& obj){
  31.     m_len = obj.m_len;
  32.     m_space = new T[m_len];
  33.     for(int i=0;i<m_len;++i){
  34.         m_space[i] = obj.m_space[i];
  35.     }
  36.     std::cout << "copy构造函数!" << std::endl;
  37. }



  38. // myv3 = myv2 = myv1;  // =操作符重载  数组对象
  39. template <typename T>
  40. MyVector<T>& MyVector<T>::operator=(const MyVector<T>& obj){
  41.     //1、先释放自己原来的
  42.     if(m_space != NULL){
  43.         delete [] m_space;
  44.         m_space=NULL;  //防止野指针
  45.         m_len = 0;
  46.     }
  47.     //2、根据新来的申请大小和空间
  48.     m_len = obj.m_len;
  49.     m_space = new T[m_len];
  50.     //3、根据新来的值 拷贝过来
  51.     for(int i=0;i<m_len;++i){
  52.         m_space[i] = obj.m_space[i];
  53.     }
  54.     std::cout << "operator=操作符重载!" << std::endl;
  55.     return *this;   //不要忘记返回 自身  适用 三个以上的连等
  56.    
  57. }


  58. // template <typename T>
  59. // ostream & operator<<(ostream &out,  const MyVector<T> &obj)
  60. // {
  61. //         for (int i=0; i<obj.m_len; i++)
  62. //         {
  63. //                 out << obj.m_space[i] << " ";
  64. //                 //out << t1;
  65. //         }
  66. //         out << endl;
  67. //         return out;
  68. // }




复制代码




2_MyVector.h
  1. #include <iostream>

  2. using namespace std;

  3. // #ifndef __PRE_JUDGE__
  4. // #define __PRE_JUDGE__
  5. //如果是int类型的数组    int array[4] = {0,1,2,3};   array[0]
  6. //类模板的思想:让算法与数据类型进行分离

  7. //构建一个模板类 数组 根据类型来自动申请分配空间

  8. template <typename T>
  9. class MyVector{
  10.     //friend ostream & operator<< <T>(ostream &out,  const MyVector<T> &obj);
  11.     //friend ostream & operator<< <T>(ostream &out,  const MyVector &obj);
  12. public:
  13.     MyVector(int size=0);
  14.     ~MyVector();
  15.     MyVector(const MyVector& obj);
  16.     T& operator[](int index);
  17.     MyVector& operator=(const MyVector& obj); //数组对象1=数组对象2
  18. public:
  19.         int getLen()
  20.         {
  21.                 return m_len;
  22.         }
  23. private:
  24.     int m_len;
  25.     T *m_space;

  26. };

  27. // #endif // __PRE_JUDGE__

复制代码





让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14439
QQ
沙发
 楼主| 发表于 2021-6-30 09:56:57 | 只看该作者
优化Teacher类, 属性变成 char *m_pname, 构造函数里面 分配内存
  1. #include <iostream>
  2. #include <string.h>
  3. #include "2_MyVector.cpp"
  4. using namespace std;

  5. //案例:数组模板类变容器,算法与数据类型分离  放 int char Teacher 的数组 都可以

  6. //1  优化Teacher类, 属性变成 char *m_pname, 构造函数里面 分配内存 析构释放内存

  7. //2  优化Teacher类,析构函数 释放panme指向的内存空间
  8. //3  优化Teacher类,避免浅拷贝 重载= 重写拷贝构造函数
  9. //4  优化Teacher类,在Teacher增加 <<   linux没有成功
  10. //5  在模板数组类中,存int char Teacher Teacher*(指针类型)

  11. //=====>stl 容器的概念 入门

  12. class Teacher{
  13. public:
  14.     Teacher()
  15.         {
  16.         //error: no matching function for call to ‘Teacher::Teacher()’m_space = new T[m_len];
  17.         //为什么要提供一个 默认构造函数?
  18.                 this->age = 0;
  19.         this->m_pname = new char[1];
  20.                 strcpy(this->m_pname, "");
  21.         cout << "Teacher的无参构造函数!" << endl;
  22.         }
  23.     Teacher(char *name, int age=8){
  24.         this->age = age;
  25.         this->m_pname = new char[strlen(name) + 1];
  26.         strcpy(this->m_pname, name);
  27.         
  28.     }
  29.     Teacher(const Teacher& obj){
  30.         this->age = obj.age;  //体会:.与->的区别  easy
  31.         
  32.         this->m_pname = new char[strlen(obj.m_pname) + 1];
  33.         strcpy(this->m_pname, obj.m_pname);
  34.         
  35.     }
  36.     ~Teacher()
  37.         {
  38.                 //this->age = 0;
  39.         if (m_pname != NULL){
  40.             delete [] m_pname;
  41.             m_pname = NULL;
  42.         }
  43.         cout << "Teacher类的 析构函数!" << endl;
  44.         }
  45. public:
  46.     Teacher& operator=(const Teacher& obj){
  47.         if (m_pname != NULL){
  48.             delete [] m_pname;
  49.             m_pname = NULL;
  50.         }
  51.         age = obj.age;
  52.         m_pname = new char[strlen(obj.m_pname) + 1];
  53.         strcpy(m_pname, obj.m_pname);
  54.         cout << "Teacher类的 =操作符重载!" << endl;
  55.         return *this;
  56.     }
  57.     void printT()
  58.         {
  59.                 cout << "名字=" <<m_pname << ", 年龄=" << age << endl;
  60.         }
  61. private:
  62.     int age;
  63.     //char name[10];  //这种情况简单 直接分配栈内存空间 这是固定的空间
  64.     char *m_pname;     // 程序活起来 名字不用固定长度了 构造函数中动态分配内存空间
  65. };

  66. int main(){

  67.     Teacher t1("t11111111111", 31),t2("t222222222222", 32),t3("t33333333", 33),t4("t44444444444", 34);
  68.     //t1 = t2; //这个还不行  
  69.     //Teacher t5 = t3;
  70.     //t1.printT();

  71.     MyVector<Teacher> myv1(4);
  72.     myv1[0] = t1;
  73.     myv1[1] = t2;
  74.     myv1[2] = t3;
  75.     myv1[3] = t4;

  76.     MyVector<Teacher> myv2(4);
  77.     myv2 = myv1;

  78.     for(int i=0;i<4;i++){
  79.         myv2[i].printT();
  80.     }
  81.    

  82.     cout << "我的容器类_Teacher复杂数据类型" << endl;
  83.     return 0;
  84. }
复制代码
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
板凳
发表于 2021-11-23 19:37:39 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-19 12:12 , Processed in 0.604787 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表