鱼C论坛

 找回密码
 立即注册
查看: 1455|回复: 0

[技术交流] C++学习

[复制链接]
发表于 2019-11-21 18:17:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
numbers.TXT

  1. 时间:2019年11月20日22:18:43;
  2. 作用:仿照C++ string用来处理数字串的类;
  3. 构造函数:
  4. //默认构造
  5. numbers():numsLen(0), numsPtr(nullptr){}
  6. //使用C风格数字数组构造
  7. numbers(const tp *arr, const size_t arrSize);
  8. //可变参数构造
  9. numbers(std::initializer_list<tp> list);
  10. //拷贝构造
  11. numbers(const numbers<tp>& nums);
  12. ****************************************************
  13. 成员函数

  14. at():
  15. 按索引获取数字串的元素;
  16. 按索引修改元素的值;

  17. size():
  18. 获取对象的大小
  19. ****************************************************
  20. 重载运算符

  21. [](改)
  22. 安索引修改对象元素的值;

  23. +(增):
  24. 添加元素;
  25. 合并对象;

  26. -(删)
  27. 删除对象中指定的数据;
  28. 删除父对象中与子对象相同的数据;

  29. %(查)
  30. 判断对象是否包含某数据;
  31. 判断子对象是否父对象的子串;

  32. /(查):
  33. 返回数据在对象中出现的次数;
  34. 返回对象与对象相同的元素;

复制代码

numbers.h
  1. #ifndef NUMBERS_H
  2. #define NUMBERS_H
  3. #include <iostream>
  4. #include <initializer_list>
  5. template <typename tp>
  6. class numbers
  7. {
  8. private:
  9.     size_t numsLen;
  10.     tp *numsPtr;

  11. public:
  12.     //1--默认构造
  13.     numbers() : numsLen(0), numsPtr(nullptr) {}
  14.     //2--使用C风格数字数组构造
  15.     numbers(const tp *arr, const size_t arrSize);
  16.     //3--可变参数构造
  17.     numbers(std::initializer_list<tp> list);
  18.     //4--拷贝构造
  19.     numbers(const numbers<tp> &nums);
  20.     /*--------------------------------------------------------*/
  21.     //5--按索引获取元素;按索引修改元素的值
  22.     tp &at(const size_t index) const;
  23.     //6--对象的大小
  24.     size_t const size() const;
  25.     /*--------------------------------------------------------*/
  26.     //7--重载下标运算符
  27.     tp &operator[](const size_t index) const;
  28.     //8--深度拷贝
  29.     numbers<tp> &operator=(const numbers<tp> &nums);
  30.     //9--重载流运算符<<
  31.     friend std::ostream &operator<<(std::ostream &os, const numbers<tp> &nums)
  32.     {
  33.         size_t sz = nums.size();
  34.         for (size_t i = 0; i < sz; i++)
  35.         {
  36.             os << nums[i] << " ";
  37.         }
  38.         return os;
  39.     }
  40.     /*--------------------------------------------------------*/
  41.     //10--添加元素
  42.     numbers<tp> operator+(const tp num) const;
  43.     //11--合并对象
  44.     numbers<tp> operator+(const numbers<tp> &nums) const;
  45.     /*--------------------------------------------------------*/
  46.     //12--判断数据在对象中存在
  47.     bool operator%(const tp num) const;
  48.     //13--判断子对象是否父对象的子串
  49.     bool operator%(const numbers<tp>& nums) const;
  50.     /*--------------------------------------------------------*/
  51.     //14--返回数据出现的次数
  52.     size_t operator/(tp num) const;
  53.     //15--返回两个对象共同的元素
  54.     numbers<tp> operator/(numbers<tp> &nums) const;
  55.     /*--------------------------------------------------------*/
  56.     //16--删除元素
  57.     numbers<tp> operator-(const tp num) const;
  58.     //17--删除父对象中与子对象中重复的元素
  59.     numbers<tp> operator-(const numbers<tp> &nums) const;
  60.     //18--按索引删除元素(数据必须是size_t类型)失败返回空串
  61.     numbers<tp> operator-(const size_t index) const;
  62.     /*--------------------------------------------------------*/
  63.     ~numbers()
  64.     {
  65.         delete[] numsPtr;
  66.     }
  67. };

  68. #endif
复制代码

numbers.cpp
  1. #include "numbers.h"
  2. //2--使用C风格数字数组构造
  3. template <typename tp>
  4. numbers<tp>::numbers(const tp *arr, const size_t arrSize) : numsLen(arrSize)
  5. {
  6.     numsPtr = new tp[numsLen];
  7.     for (size_t i = 0; i < numsLen; i++)
  8.     {
  9.         *(numsPtr + i) = *(arr + i);
  10.     }
  11. }
  12. //3--可变参数构造
  13. template <typename tp>
  14. numbers<tp>::numbers(std::initializer_list<tp> list) : numsLen(list.size())
  15. {
  16.     numsPtr = new tp[numsLen];
  17.     for (size_t i = 0; i < numsLen; i++)
  18.     {
  19.         *(numsPtr + i) = *(list.begin() + i);
  20.     }
  21. }
  22. //4--拷贝构造
  23. template <typename tp>
  24. numbers<tp>::numbers(const numbers<tp> &nums) : numsLen(nums.numsLen)
  25. {
  26.     numsPtr = new tp[numsLen];
  27.     for (size_t i = 0; i < numsLen; i++)
  28.     {
  29.         *(numsPtr + i) = *(nums.numsPtr + i);
  30.     }
  31. }
  32. /*--------------------------------------------------------------------*/
  33. //5--按索引获取元素;按索引修改元素的值
  34. template <typename tp>
  35. inline tp &numbers<tp>::at(const size_t index) const
  36. {
  37.     return numsPtr[index];
  38. }
  39. //6--对象的大小
  40. template <typename tp>
  41. inline const size_t numbers<tp>::size() const
  42. {
  43.     return numsLen;
  44. }
  45. /*--------------------------------------------------------*/
  46. //7--重载下标运算符
  47. template <typename tp>
  48. inline tp &numbers<tp>::operator[](const size_t index) const
  49. {
  50.     return numsPtr[index];
  51. }
  52. /*--------------------------------------------------------*/
  53. //8--深度拷贝
  54. template <typename tp>
  55. numbers<tp> &numbers<tp>::operator=(const numbers<tp> &nums)
  56. {
  57.     if (numsPtr != nullptr)
  58.     {
  59.         numsLen = nums.numsLen;
  60.         delete[] numsPtr;
  61.         numsPtr = new tp[numsLen];
  62.         for (size_t i = 0; i < numsLen; i++)
  63.         {
  64.             *(numsPtr + i) = *(nums.numsPtr + i);
  65.         }
  66.     }
  67.     else
  68.     {
  69.         numsLen = nums.numsLen;
  70.         numsPtr = new tp[numsLen];
  71.         for (size_t i = 0; i < nums.numsLen; i++)
  72.         {
  73.             this->at(i) = *(nums.numsPtr + i);
  74.         }
  75.     }
  76.     return *this;
  77. }
  78. /*--------------------------------------------------------*/
  79. //10--添加元素
  80. template <typename tp>
  81. numbers<tp> numbers<tp>::operator+(const tp num) const
  82. {
  83.     numbers<tp> t_nums = *this;
  84.     if (t_nums.numsPtr != nullptr)
  85.     {
  86.         tp *t_numsPtr = new tp[numsLen + 1];
  87.         for (size_t i = 0; i < numsLen; i++)
  88.         {
  89.             *(t_numsPtr + i) = this->at(i);
  90.         }
  91.         *(t_numsPtr + numsLen) = num;
  92.         t_nums.numsLen++;
  93.         delete[] t_nums.numsPtr;
  94.         t_nums.numsPtr = t_numsPtr;
  95.     }
  96.     else
  97.     {
  98.         t_nums.numsLen+=1;
  99.         t_nums.numsPtr = new tp[numsLen]{num};
  100.     }

  101.     return t_nums;
  102. }
  103. //11--合并对象
  104. template <typename tp>
  105. numbers<tp> numbers<tp>::operator+(const numbers<tp> &nums) const
  106. {
  107.     numbers<tp> t_nums;
  108.     if (numsPtr != nullptr)
  109.     {
  110.         t_nums = *this;
  111.         for (size_t i = 0; i < nums.numsLen; i++)
  112.         {
  113.             t_nums = t_nums + *(nums.numsPtr + i);
  114.         }
  115.     }
  116.     else
  117.     {
  118.         t_nums = nums;
  119.     }

  120.     return t_nums;
  121. }
  122. /*--------------------------------------------------------*/
  123. //12--判断数据在对象中是否存在
  124. template <typename tp>
  125. bool numbers<tp>::operator%(const tp num) const
  126. {
  127.     bool flag = false;
  128.     if (numsPtr != nullptr)
  129.     {
  130.         for (size_t i = 0; i < numsLen; i++)
  131.         {
  132.             if (num == *(numsPtr + i))
  133.             {
  134.                 flag = true;
  135.                 break;
  136.             }
  137.         }
  138.     }
  139.     return flag;
  140. }
  141. //13--判断子对象是否父对象的子串
  142. template <typename tp>
  143. bool numbers<tp>::operator%(const numbers<tp> &nums) const
  144. {
  145.     bool flag = false;
  146.     size_t count = 1;
  147.     if (numsLen > nums.numsLen)
  148.     {
  149.         for (size_t i = 0; i < nums.numsLen; i++)
  150.         {
  151.             if ((*this) % (*(nums.numsPtr + i)))
  152.             {
  153.                 count++;
  154.                 if (count == nums.numsLen)
  155.                 {
  156.                     break;
  157.                 }
  158.             }
  159.         }
  160.         if (count == nums.numsLen)
  161.         {
  162.             flag = true;
  163.         }
  164.     }
  165.     if (nums.numsPtr == 0)
  166.     {
  167.         flag = true;
  168.     }
  169.     return flag;
  170. }
  171. /*--------------------------------------------------------*/
  172. //14--返回数据出现的次数
  173. template <typename tp>
  174. size_t numbers<tp>::operator/(tp num) const
  175. {
  176.     size_t count = 0;
  177.     if (numsPtr != nullptr)
  178.     {
  179.         for (size_t i = 0; i < numsLen; i++)
  180.         {
  181.             if (this->at(i) == num)
  182.             {
  183.                 count++;
  184.             }
  185.         }
  186.     }
  187.     return count;
  188. }
  189. //15--返回两个对象共同的元素
  190. template <typename tp>
  191. numbers<tp> numbers<tp>::operator/(numbers<tp> &nums) const
  192. {
  193.     numbers<tp> r_nums;
  194.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  195.     {
  196.         for (size_t i = 0; i < nums.numsLen; i++)
  197.         {
  198.             if ((*this)% (*(nums.numsPtr + i)))
  199.             {
  200.                 r_nums = r_nums + *(nums.numsPtr + i);
  201.             }
  202.         }
  203.     }
  204.     return r_nums;
  205. }
  206. /*--------------------------------------------------------*/
  207. //16--删除元素
  208. template <typename tp>
  209. numbers<tp> numbers<tp>::operator-(const tp num) const
  210. {
  211.     numbers<tp> r_nums;
  212.     if (numsPtr != nullptr)
  213.     {
  214.         for (size_t i = 0; i < numsLen; i++)
  215.         {
  216.             if (this->at(i) != num)
  217.             {
  218.                 r_nums = r_nums + *(numsPtr + i);
  219.             }
  220.         }
  221.     }
  222.     return r_nums;
  223. }
  224. //17--删除父对象中与子对象中重复的元素
  225. template <typename tp>
  226. numbers<tp> numbers<tp>::operator-(const numbers<tp>& nums) const
  227. {
  228.     numbers<tp> r_nums;
  229.     size_t count = 0;
  230.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  231.     /*两个非空数字串*/
  232.     {
  233.         r_nums = *this;
  234.         for (size_t i = 0; i < nums.numsLen; i++)
  235.         {
  236.             r_nums = r_nums - *(nums.numsPtr + i);            
  237.         }
  238.         if (r_nums.numsLen == 0)
  239.         {
  240.             delete [] r_nums.numsPtr;
  241.             r_nums.numsPtr = nullptr;
  242.         }
  243.     }
  244.     else if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))
  245.     /*子串为空*/
  246.     {
  247.         r_nums = *this;
  248.     }
  249.     return r_nums;
  250. }
  251. //18--按索引删除元素(数据必须是size_t类型)失败返回空串
  252. template <typename tp>
  253. numbers<tp> numbers<tp>::operator-(size_t index) const
  254. {
  255.     numbers<tp> r_nums;
  256.     if ((index < numsLen ) && (numsPtr != nullptr))
  257.     {
  258.         for (size_t i = 0; i < index; i++)
  259.         {
  260.             r_nums = r_nums + *(numsPtr + i);
  261.         }
  262.         for (size_t i = index + 1; i < numsLen; i++)
  263.         {
  264.             r_nums = r_nums + *(numsPtr + i);
  265.         }
  266.     }
  267.     return r_nums;
  268. }
复制代码

=================================================================================
main.c
  1. #include "numbers.cpp"
  2. int main(int argc, char const *argv[])
  3. {
  4.     numbers<int> a = {1}, b = {2}, c, z, d = {1, 2, 3}, e = {7, 9, 10}, f = {1,2,3,9,2,12};
  5.     z = a + 2 + 3 + b + c + 4 + 5 + b + c;//测试+号重载,可以连加但必须数字串对象开头
  6.     std::cout << z << std::endl;//测试<<
  7.     std::cout<<z%1<<" "<<z%e<<" "<<z%f<<std::endl;//测试%重载,数字串对象必须在首位
  8.     std::cout<<z/2<<"\n"<<z/f<<"\n"<<z/e<<std::endl;//测试\号重载,
  9.     numbers<int> nums0 = {1,2,2,3,6,8,69,6,2,2,5,899};
  10.     std::cout<<nums0<<std::endl;//测试-号重载,数字串必须对象在首位
  11.     numbers<int> nums1;
  12.     nums0 = nums0 - nums1;//
  13.     std::cout<<"空串测试"<<nums0<<std::endl;
  14.     nums0 = nums0 - 899;//
  15.     std::cout<<"数字测试"<<nums0<<std::endl;
  16.     nums0 = nums0 - (size_t)0;//
  17.     std::cout<<"索引测试"<<nums0<<std::endl;
  18.     nums0 = nums0 - z;//
  19.     std::cout<<"非空对象测试(有相同元素)"<<nums0<<std::endl;
  20.     nums0 = nums0 - e;//
  21.     std::cout<<"非空对象测试(无相同元素)"<<nums0<<std::endl;
  22.     return 0;
  23. }
复制代码

----------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-n5ukogix.do5 --stdout=Microsoft-MIEngine-Out-c5k34mn0.wwi --stderr=Microsoft-MIEngine-Error-k43i2w1i.n55 --pid=Microsoft-MIEngine-Pid-mqrubay4.n0f --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
1 2 3 2 4 5 2
1 0 0
3
1 2 3 2

1 2 2 3 6 8 69 6 2 2 5 899
空串测试1 2 2 3 6 8 69 6 2 2 5 899
数字测试1 2 2 3 6 8 69 6 2 2 5
索引测试2 2 3 6 8 69 6 2 2 5
非空对象测试(有相同元素)6 8 69 6
非空对象测试(无相同元素)6 8 69 6


E:\Users\admin\Documents\VScode>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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