鱼C论坛

 找回密码
 立即注册
查看: 1635|回复: 1

[技术交流] C++ number.h更新

[复制链接]
发表于 2019-11-24 22:23:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 bin554385863 于 2019-11-24 22:51 编辑
  1. 构造函数:
  2. //默认构造
  3. numbers():numsLen(0), numsPtr(nullptr){}
  4. //使用C风格数字数组构造
  5. numbers(const tp *arr, const size_t arrSize);
  6. //字符数组构造
  7. numbers(const char *ncstr)------2019年11月24日22:35:17增加
  8. //可变参数构造
  9. numbers(std::initializer_list<tp> list);
  10. //拷贝构造
  11. numbers(const numbers<tp>& nums);
  12. 注意:使用时请按规范输入数字或者数字字符数组,不然出现数据错误;
  13. "-566666"---正确;
  14. "*55555"---错误;*号会转化成错误数据;
  15. 除了-号请不要再数字字符前添加任何字符包括+号;

  16. ****************************************************
  17. 成员函数

  18. at()(为了方便this指针使用,普通对象请使用索引符[]):
  19. 按索引获取数字串的元素;
  20. 按索引修改元素的值;

  21. size():
  22. 获取对象的大小
  23. ****************************************************
  24. 重载运算符

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

  27. +(增):
  28. 添加元素;
  29. 合并对象;

  30. -(删)
  31. 删除对象中指定的数据;
  32. 删除父对象中与子对象相同的数据;
  33. 按索引删除元素参数必须显示声明为size_t类型
  34. 对象翻转数据的正负属性;------2019年11月24日22:35:32增加

  35. %(查)
  36. 判断对象是否包含某数据;
  37. 判断子对象是否父对象的子串;

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

  41. 赋值运算符:

  42. +=
  43. /=
  44. -=
  45. 右边必须是可改变的对象;
复制代码

1---增加数字字符数组构造函数:
    numbers(const char* ncstr);
  1. template <typename tp>
  2. numbers<tp>::numbers(const char *ncstr)
  3. {
  4.     std::string tstr = ncstr;
  5.     if (ncstr[0] == '-')
  6.     {
  7.         numsLen = tstr.size() - 1;
  8.         numsPtr = new tp[numsLen];
  9.         tstr.erase(0, 1);
  10.         for (size_t i = 0; i < numsLen; i++)
  11.         {
  12.             *(numsPtr + i) = tstr[i] - '0';
  13.         }
  14.     }
  15.     if(ncstr[0] != '-')
  16.     {
  17.         numsLen = tstr.size();
  18.         numsPtr = new tp[numsLen];
  19.         for (size_t i = 0; i < numsLen; i++)
  20.         {
  21.             *(numsPtr + i) = tstr[i] - '0';
  22.         }
  23.     }
  24. }
复制代码



2---增加翻转对象数据正负符号重载:
    numbers<tp> operator-(void) const;
  1. template <typename tp>
  2. numbers<tp> numbers<tp>::operator-(void) const
  3. {
  4.     numbers<tp> r_nums;
  5.     for (size_t i = 0; i < numsLen; i++)
  6.     {
  7.         r_nums += -*(numsPtr + i);
  8.     }
  9.     return r_nums;
  10. }
复制代码

完整代码
numbers.h
  1. #ifndef NUMBERS_H
  2. #define NUMBERS_H
  3. #include <iostream>
  4. #include <initializer_list>
  5. #include <string>
  6. template <typename tp>
  7. class numbers
  8. {
  9. private:
  10.     size_t numsLen;
  11.     tp *numsPtr;
  12. public:
  13.     //1--默认构造
  14.     numbers() : numsLen(0), numsPtr(nullptr) {}
  15.     //2--使用C风格数字数组构造
  16.     numbers(const tp *arr, const size_t arrSize);
  17.     //2*--char数字字符串构造
  18.     numbers(const char* ncstr);
  19.     //3--可变参数构造
  20.     numbers(std::initializer_list<tp> list);
  21.     //4--拷贝构造
  22.     numbers(const numbers<tp> &nums);
  23.     /*--------------------------------------------------------*/
  24.     //5--按索引获取元素;按索引修改元素的值
  25.     tp &at(const size_t index) const;
  26.     //6--对象的大小
  27.     size_t const size() const;
  28.     /*--------------------------------------------------------*/
  29.     //7--重载下标运算符
  30.     tp &operator[](const size_t index) const;
  31.     //8--深度拷贝
  32.     numbers<tp> &operator=(const numbers<tp> &nums);
  33.     //9--重载流运算符<<
  34.     friend std::ostream &operator<<(std::ostream &os, const numbers<tp> &nums)
  35.     {
  36.         size_t sz = nums.size();
  37.         for (size_t i = 0; i < sz; i++)
  38.         {
  39.             os << nums[i];
  40.         }
  41.         return os;
  42.     }
  43.     /*--------------------------------------------------------*/
  44.     //10--添加元素
  45.     numbers<tp> operator+(const tp num) const;
  46.     numbers<tp>& operator+=(const tp num)
  47.     {
  48.         *this = *this + num;
  49.         return *this;
  50.     }
  51.     //11--合并对象
  52.     numbers<tp> operator+(const numbers<tp> &nums) const;
  53.     numbers<tp>& operator+=(const numbers<tp> &nums)
  54.     {
  55.         *this = *this + nums;
  56.         return *this;
  57.     }
  58.     /*--------------------------------------------------------*/
  59.     //12--判断数据在对象中存在
  60.     bool operator%(const tp num) const;
  61.     //13--判断子对象是否父对象的子串
  62.     bool operator%(const numbers<tp>& nums) const;
  63.     /*--------------------------------------------------------*/
  64.     //14--返回数据出现的次数
  65.     size_t operator/(tp num) const;
  66.     //15--返回两个对象共同的元素
  67.     numbers<tp> operator/(const numbers<tp> &nums) const;
  68.     //15-1返回并赋值
  69.     numbers<tp> operator/=(const numbers<tp> &nums)
  70.     {
  71.         *this = *this / nums;
  72.         return *this;
  73.     }
  74.     /*--------------------------------------------------------*/
  75.     //16--删除元素
  76.     numbers<tp> operator-(const tp num) const;
  77.     numbers<tp> operator-=(const tp num)
  78.     {
  79.         *this = *this - num;
  80.         return *this;
  81.     }
  82.     //17--删除父对象中与子对象中重复的元素
  83.     numbers<tp> operator-(const numbers<tp> &nums) const;
  84.     numbers<tp> operator-=(const numbers<tp> &nums)
  85.     {
  86.         *this = *this - nums;
  87.         return *this;
  88.     }
  89.     //18--按索引删除元素(数据必须显示声明size_t类型)失败返回空串
  90.     numbers<tp> operator-(const size_t index) const;
  91.     numbers<tp> operator-=(const size_t index)
  92.     {
  93.         *this = *this - this->at(index);
  94.         return *this;
  95.     }
  96.     //19-翻转数据的正负
  97.     numbers<tp> operator-(void) const;
  98.     /*--------------------------------------------------------*/
  99.     ~numbers()
  100.     {
  101.         delete[] numsPtr;
  102.     }
  103. };
  104. //2--使用C风格数字数组构造
  105. template <typename tp>
  106. numbers<tp>::numbers(const tp *arr, const size_t arrSize) : numsLen(arrSize)
  107. {
  108.     numsPtr = new tp[numsLen];
  109.     for (size_t i = 0; i < numsLen; i++)
  110.     {
  111.         *(numsPtr + i) = *(arr + i);
  112.     }
  113. }
  114. //char字符串构造
  115. template <typename tp>
  116. numbers<tp>::numbers(const char *ncstr)
  117. {
  118.     std::string tstr = ncstr;
  119.     if (ncstr[0] == '-')
  120.     {
  121.         numsLen = tstr.size() - 1;
  122.         numsPtr = new tp[numsLen];
  123.         tstr.erase(0, 1);
  124.         for (size_t i = 0; i < numsLen; i++)
  125.         {
  126.             *(numsPtr + i) = tstr[i] - '0';
  127.         }
  128.     }
  129.     if(ncstr[0] != '-')
  130.     {
  131.         numsLen = tstr.size();
  132.         numsPtr = new tp[numsLen];
  133.         for (size_t i = 0; i < numsLen; i++)
  134.         {
  135.             *(numsPtr + i) = tstr[i] - '0';
  136.         }
  137.     }
  138. }
  139. //3--可变参数构造
  140. template <typename tp>
  141. numbers<tp>::numbers(std::initializer_list<tp> list) : numsLen(list.size())
  142. {
  143.     numsPtr = new tp[numsLen];
  144.     for (size_t i = 0; i < numsLen; i++)
  145.     {
  146.         *(numsPtr + i) = *(list.begin() + i);
  147.     }
  148. }
  149. //4--拷贝构造
  150. template <typename tp>
  151. numbers<tp>::numbers(const numbers<tp> &nums)
  152. {
  153.     if (nums.numsPtr != nullptr)
  154.     {
  155.         numsLen = nums.numsLen;
  156.         numsPtr = new tp[numsLen];
  157.         for (size_t i = 0; i < numsLen; i++)
  158.         {
  159.             *(numsPtr + i) = *(nums.numsPtr + i);
  160.         }
  161.     }
  162.     else
  163.     {
  164.         numsLen = 0;
  165.         numsPtr = nullptr;
  166.     }
  167.    
  168. }
  169. /*--------------------------------------------------------------------*/
  170. //5--按索引获取元素;按索引修改元素的值
  171. template <typename tp>
  172. inline tp &numbers<tp>::at(const size_t index) const
  173. {
  174.     return numsPtr[index];
  175. }
  176. //6--对象的大小
  177. template <typename tp>
  178. inline const size_t numbers<tp>::size() const
  179. {
  180.     return numsLen;
  181. }
  182. /*--------------------------------------------------------*/
  183. //7--重载下标运算符
  184. template <typename tp>
  185. inline tp &numbers<tp>::operator[](const size_t index) const
  186. {
  187.     return numsPtr[index];
  188. }
  189. /*--------------------------------------------------------*/
  190. //8--深度拷贝
  191. template <typename tp>
  192. numbers<tp> &numbers<tp>::operator=(const numbers<tp> &nums)
  193. {
  194.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))//非空串的深度拷贝
  195.     {
  196.         numsLen = nums.numsLen;
  197.         delete[] numsPtr;
  198.         numsPtr = new tp[numsLen];
  199.         for (size_t i = 0; i < numsLen; i++)
  200.         {
  201.             *(numsPtr + i) = *(nums.numsPtr + i);
  202.         }
  203.     }
  204.     if((numsPtr == nullptr)&&(nums.numsPtr != nullptr))//调用对象为空,操作对象非空
  205.     {
  206.         numsLen = nums.numsLen;
  207.         numsPtr = new tp[numsLen];
  208.         for (size_t i = 0; i < nums.numsLen; i++)
  209.         {
  210.             this->at(i) = *(nums.numsPtr + i);
  211.         }
  212.     }
  213.     if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))//调用对象非空,操作对象为空
  214.     {
  215.         numsLen = 0;
  216.         delete [] numsPtr;
  217.         numsPtr = nullptr;
  218.     }
  219.    
  220.     return *this;
  221. }
  222. /*--------------------------------------------------------*/
  223. //10--添加元素
  224. template <typename tp>
  225. numbers<tp> numbers<tp>::operator+(const tp num) const
  226. {
  227.     numbers<tp> r_nums;
  228.     if (numsPtr != nullptr)
  229.     {
  230.         r_nums = *this;
  231.         tp *t_numsPtr = new tp[numsLen + 1];
  232.         for (size_t i = 0; i < numsLen; i++)
  233.         {
  234.             *(t_numsPtr + i) = this->at(i);
  235.         }
  236.         *(t_numsPtr + numsLen) = num;
  237.         r_nums.numsLen++;
  238.         delete[] r_nums.numsPtr;
  239.         r_nums.numsPtr = t_numsPtr;
  240.     }
  241.     else
  242.     {
  243.         r_nums.numsLen = 1 + numsLen;
  244.         r_nums.numsPtr = new tp[numsLen + 1]{num};
  245.     }

  246.     return r_nums;
  247. }
  248. //11--合并对象
  249. template <typename tp>
  250. numbers<tp> numbers<tp>::operator+(const numbers<tp> &nums) const
  251. {
  252.     numbers<tp> t_nums;
  253.     if (numsPtr != nullptr)
  254.     {
  255.         t_nums = *this;
  256.         for (size_t i = 0; i < nums.numsLen; i++)
  257.         {
  258.             t_nums = t_nums + *(nums.numsPtr + i);
  259.         }
  260.     }
  261.     else
  262.     {
  263.         t_nums = nums;
  264.     }

  265.     return t_nums;
  266. }
  267. /*--------------------------------------------------------*/
  268. //12--判断数据在对象中是否存在
  269. template <typename tp>
  270. bool numbers<tp>::operator%(const tp num) const
  271. {
  272.     bool flag = false;
  273.     if (numsPtr != nullptr)
  274.     {
  275.         for (size_t i = 0; i < numsLen; i++)
  276.         {
  277.             if (num == *(numsPtr + i))
  278.             {
  279.                 flag = true;
  280.                 break;
  281.             }
  282.         }
  283.     }
  284.     return flag;
  285. }
  286. //13--判断子对象是否父对象的子串
  287. template <typename tp>
  288. bool numbers<tp>::operator%(const numbers<tp> &nums) const
  289. {
  290.     bool flag = false;
  291.     size_t count = 1;
  292.     if (numsLen > nums.numsLen)
  293.     {
  294.         for (size_t i = 0; i < nums.numsLen; i++)
  295.         {
  296.             if ((*this) % (*(nums.numsPtr + i)))
  297.             {
  298.                 count++;
  299.                 if (count == nums.numsLen)
  300.                 {
  301.                     break;
  302.                 }
  303.             }
  304.         }
  305.         if (count == nums.numsLen)
  306.         {
  307.             flag = true;
  308.         }
  309.     }
  310.     if (nums.numsPtr == 0)
  311.     {
  312.         flag = true;
  313.     }
  314.     return flag;
  315. }
  316. /*--------------------------------------------------------*/
  317. //14--返回数据出现的次数
  318. template <typename tp>
  319. size_t numbers<tp>::operator/(tp num) const
  320. {
  321.     size_t count = 0;
  322.     if (numsPtr != nullptr)
  323.     {
  324.         for (size_t i = 0; i < numsLen; i++)
  325.         {
  326.             if (this->at(i) == num)
  327.             {
  328.                 count++;
  329.             }
  330.         }
  331.     }
  332.     return count;
  333. }
  334. //15--返回两个对象共同的元素
  335. template <typename tp>
  336. numbers<tp> numbers<tp>::operator/(const numbers<tp> &nums) const
  337. {
  338.     numbers<tp> r_nums;
  339.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  340.     {
  341.         for (size_t i = 0; i < nums.numsLen; i++)
  342.         {
  343.             if ((*this)% (*(nums.numsPtr + i)))
  344.             {
  345.                 r_nums += (*(nums.numsPtr + i));
  346.             }
  347.         }
  348.     }
  349.     return r_nums;
  350. }
  351. /*--------------------------------------------------------*/
  352. //16--删除对象中符合条件的元素
  353. template <typename tp>
  354. numbers<tp> numbers<tp>::operator-(const tp num) const
  355. {
  356.     numbers<tp> r_nums;
  357.     if (numsPtr != nullptr)
  358.     {
  359.         for (size_t i = 0; i < numsLen; i++)
  360.         {
  361.             if (this->at(i) != num)
  362.             {
  363.                 r_nums += *(numsPtr + i);
  364.             }
  365.         }
  366.     }
  367.     return r_nums;
  368. }
  369. //17--删除父对象中与子对象中重复的元素
  370. template <typename tp>
  371. numbers<tp> numbers<tp>::operator-(const numbers<tp>& nums) const
  372. {
  373.     numbers<tp> r_nums;
  374.     size_t count = 0;
  375.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  376.     /*两个非空数字串*/
  377.     {
  378.         r_nums = *this;
  379.         for (size_t i = 0; i < nums.numsLen; i++)
  380.         {
  381.             if ((*this)%(*(nums.numsPtr + i)))
  382.             {
  383.                 r_nums = r_nums - *(nums.numsPtr + i);   
  384.             }     
  385.         }
  386.         if (r_nums.numsLen == 0)
  387.         {
  388.             delete [] r_nums.numsPtr;
  389.             r_nums.numsPtr = nullptr;
  390.         }
  391.     }
  392.     else if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))
  393.     /*子串为空*/
  394.     {
  395.         r_nums = *this;
  396.     }
  397.     return r_nums;
  398. }
  399. //18--按索引删除元素(数据必须是size_t类型)失败返回空串
  400. template <typename tp>
  401. numbers<tp> numbers<tp>::operator-(const size_t index) const
  402. {
  403.     numbers<tp> r_nums;
  404.     if ((index < numsLen ) && (numsPtr != nullptr))
  405.     {
  406.         for (size_t i = 0; i < index; i++)
  407.         {
  408.             r_nums = r_nums + *(numsPtr + i);
  409.         }
  410.         for (size_t i = index + 1; i < numsLen; i++)
  411.         {
  412.             r_nums = r_nums + *(numsPtr + i);
  413.         }
  414.     }
  415.     return r_nums;
  416. }
  417. //19-翻转数据的正负
  418. template <typename tp>
  419. numbers<tp> numbers<tp>::operator-(void) const
  420. {
  421.     numbers<tp> r_nums;
  422.     for (size_t i = 0; i < numsLen; i++)
  423.     {
  424.         r_nums += -*(numsPtr + i);
  425.     }
  426.     return r_nums;
  427. }
  428. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-24 23:38:30 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-25 02:12 编辑

2019年11月24日23:36:39
-----增加私有函数
void isnumbers(std::string& str);
  1. //判断是否是数字字符串
  2. template <typename tp>
  3. void numbers<tp>::isnumbers(const std::string &str)
  4. {
  5.     size_t s = str.size();
  6.     bool flag = true;
  7.     if (str[0] != '-' && (!isdigit(str[0])))
  8.     {
  9.         flag = false;
  10.     }
  11.     if (str[0] == '-' || (isdigit(str[0])))
  12.     {
  13.         for (size_t i = 1; i < s; i++)
  14.         {
  15.             if(!isdigit(str[i]))
  16.             {
  17.                 flag = false;
  18.                 std::cerr<<"Cannot convert to a valid number!"<<std::endl;
  19.                 exit(1);
  20.             }
  21.         }
  22.         
  23.     }
  24. }
复制代码

numbers.h
  1. #ifndef NUMBERS_H
  2. #define NUMBERS_H
  3. #include <iostream>
  4. #include <initializer_list>
  5. #include <string>
  6. #include <cctype>
  7. template <typename tp>
  8. class numbers
  9. {
  10. private:
  11.     size_t numsLen;
  12.     tp *numsPtr;
  13.     void isnumbers(const std::string& str);
  14. public:
  15.     //1--默认构造
  16.     numbers() : numsLen(0), numsPtr(nullptr) {}
  17.     //2--使用C风格数字数组构造
  18.     numbers(const tp *arr, const size_t arrSize);
  19.     //2*--char数字字符串构造
  20.     numbers(const char* ncstr);
  21.     //3--可变参数构造
  22.     numbers(std::initializer_list<tp> list);
  23.     //4--拷贝构造
  24.     numbers(const numbers<tp> &nums);
  25.     /*--------------------------------------------------------*/
  26.     //5--按索引获取元素;按索引修改元素的值
  27.     tp &at(const size_t index) const;
  28.     //6--对象的大小
  29.     size_t const size() const;
  30.     /*--------------------------------------------------------*/
  31.     //7--重载下标运算符
  32.     tp &operator[](const size_t index) const;
  33.     //8--深度拷贝
  34.     numbers<tp> &operator=(const numbers<tp> &nums);
  35.     //9--重载流运算符<<
  36.     friend std::ostream &operator<<(std::ostream &os, const numbers<tp> &nums)
  37.     {
  38.         size_t sz = nums.size();
  39.         for (size_t i = 0; i < sz; i++)
  40.         {
  41.             os << nums[i];
  42.         }
  43.         return os;
  44.     }
  45.     /*--------------------------------------------------------*/
  46.     //10--添加元素
  47.     numbers<tp> operator+(const tp num) const;
  48.     numbers<tp>& operator+=(const tp num)
  49.     {
  50.         *this = *this + num;
  51.         return *this;
  52.     }
  53.     //11--合并对象
  54.     numbers<tp> operator+(const numbers<tp> &nums) const;
  55.     numbers<tp>& operator+=(const numbers<tp> &nums)
  56.     {
  57.         *this = *this + nums;
  58.         return *this;
  59.     }
  60.     /*--------------------------------------------------------*/
  61.     //12--判断数据在对象中存在
  62.     bool operator%(const tp num) const;
  63.     //13--判断子对象是否父对象的子串
  64.     bool operator%(const numbers<tp>& nums) const;
  65.     /*--------------------------------------------------------*/
  66.     //14--返回数据出现的次数
  67.     size_t operator/(tp num) const;
  68.     //15--返回两个对象共同的元素
  69.     numbers<tp> operator/(const numbers<tp> &nums) const;
  70.     //15-1返回并赋值
  71.     numbers<tp> operator/=(const numbers<tp> &nums)
  72.     {
  73.         *this = *this / nums;
  74.         return *this;
  75.     }
  76.     /*--------------------------------------------------------*/
  77.     //16--删除元素
  78.     numbers<tp> operator-(const tp num) const;
  79.     numbers<tp> operator-=(const tp num)
  80.     {
  81.         *this = *this - num;
  82.         return *this;
  83.     }
  84.     //17--删除父对象中与子对象中重复的元素
  85.     numbers<tp> operator-(const numbers<tp> &nums) const;
  86.     numbers<tp> operator-=(const numbers<tp> &nums)
  87.     {
  88.         *this = *this - nums;
  89.         return *this;
  90.     }
  91.     //18--按索引删除元素(数据必须显示声明size_t类型)失败返回空串
  92.     numbers<tp> operator-(const size_t index) const;
  93.     numbers<tp> operator-=(const size_t index)
  94.     {
  95.         *this = *this - this->at(index);
  96.         return *this;
  97.     }
  98.     //19-翻转数据的正负
  99.     numbers<tp> operator-(void) const;
  100.     /*--------------------------------------------------------*/
  101.     ~numbers()
  102.     {
  103.         delete[] numsPtr;
  104.     }
  105. };

  106. //判断是否是数字字符串
  107. template <typename tp>
  108. void numbers<tp>::isnumbers(const std::string &str)
  109. {
  110.     size_t s = str.size();
  111.     bool flag = true;
  112.     if (str[0] != '-' && (!isdigit(str[0])))
  113.     {
  114.         flag = false;
  115.     }
  116.     if (str[0] == '-' || (isdigit(str[0])))
  117.     {
  118.         for (size_t i = 1; i < s; i++)
  119.         {
  120.             if(!isdigit(str[i]))
  121.             {
  122.                 flag = false;
  123.                 std::cerr<<"Cannot convert to a valid number!"<<std::endl;
  124.                 exit(1);
  125.             }
  126.         }
  127.         
  128.     }
  129. }
  130. //2--使用C风格数字数组构造
  131. template <typename tp>
  132. numbers<tp>::numbers(const tp *arr, const size_t arrSize) : numsLen(arrSize)
  133. {
  134.     numsPtr = new tp[numsLen];
  135.     for (size_t i = 0; i < numsLen; i++)
  136.     {
  137.         *(numsPtr + i) = *(arr + i);
  138.     }
  139. }
  140. //char字符串构造
  141. template <typename tp>
  142. numbers<tp>::numbers(const char *ncstr)
  143. {
  144.     std::string tstr = ncstr;
  145.     isnumbers(tstr);
  146.     if (tstr[0] == '-')
  147.     {
  148.         size_t s = tstr.size();
  149.         numsLen = tstr.size() - 1;
  150.         numsPtr = new tp[numsLen];
  151.         tstr.erase(0, 1);
  152.         for (size_t i = 0; i < numsLen; i++)
  153.         {
  154.             *(numsPtr + i) = '0' - tstr[i];
  155.         }
  156.     }
  157.     else if (isdigit(tstr[0]))
  158.     {
  159.         numsLen = tstr.size();
  160.         numsPtr = new tp[numsLen];
  161.         for (size_t i = 0; i < numsLen; i++)
  162.         {
  163.             *(numsPtr + i) = tstr[i] - '0';
  164.         }
  165.     }
  166. }
  167. //3--可变参数构造
  168. template <typename tp>
  169. numbers<tp>::numbers(std::initializer_list<tp> list) : numsLen(list.size())
  170. {
  171.     numsPtr = new tp[numsLen];
  172.     for (size_t i = 0; i < numsLen; i++)
  173.     {
  174.         *(numsPtr + i) = *(list.begin() + i);
  175.     }
  176. }
  177. //4--拷贝构造
  178. template <typename tp>
  179. numbers<tp>::numbers(const numbers<tp> &nums)
  180. {
  181.     if (nums.numsPtr != nullptr)
  182.     {
  183.         numsLen = nums.numsLen;
  184.         numsPtr = new tp[numsLen];
  185.         for (size_t i = 0; i < numsLen; i++)
  186.         {
  187.             *(numsPtr + i) = *(nums.numsPtr + i);
  188.         }
  189.     }
  190.     else
  191.     {
  192.         numsLen = 0;
  193.         numsPtr = nullptr;
  194.     }
  195.    
  196. }
  197. /*--------------------------------------------------------------------*/
  198. //5--按索引获取元素;按索引修改元素的值
  199. template <typename tp>
  200. inline tp &numbers<tp>::at(const size_t index) const
  201. {
  202.     return numsPtr[index];
  203. }
  204. //6--对象的大小
  205. template <typename tp>
  206. inline const size_t numbers<tp>::size() const
  207. {
  208.     return numsLen;
  209. }
  210. /*--------------------------------------------------------*/
  211. //7--重载下标运算符
  212. template <typename tp>
  213. inline tp &numbers<tp>::operator[](const size_t index) const
  214. {
  215.     return numsPtr[index];
  216. }
  217. /*--------------------------------------------------------*/
  218. //8--深度拷贝
  219. template <typename tp>
  220. numbers<tp> &numbers<tp>::operator=(const numbers<tp> &nums)
  221. {
  222.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))//非空串的深度拷贝
  223.     {
  224.         numsLen = nums.numsLen;
  225.         delete[] numsPtr;
  226.         numsPtr = new tp[numsLen];
  227.         for (size_t i = 0; i < numsLen; i++)
  228.         {
  229.             *(numsPtr + i) = *(nums.numsPtr + i);
  230.         }
  231.     }
  232.     if((numsPtr == nullptr)&&(nums.numsPtr != nullptr))//调用对象为空,操作对象非空
  233.     {
  234.         numsLen = nums.numsLen;
  235.         numsPtr = new tp[numsLen];
  236.         for (size_t i = 0; i < nums.numsLen; i++)
  237.         {
  238.             this->at(i) = *(nums.numsPtr + i);
  239.         }
  240.     }
  241.     if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))//调用对象非空,操作对象为空
  242.     {
  243.         numsLen = 0;
  244.         delete [] numsPtr;
  245.         numsPtr = nullptr;
  246.     }
  247.    
  248.     return *this;
  249. }
  250. /*--------------------------------------------------------*/
  251. //10--添加元素
  252. template <typename tp>
  253. numbers<tp> numbers<tp>::operator+(const tp num) const
  254. {
  255.     numbers<tp> r_nums;
  256.     if (numsPtr != nullptr)
  257.     {
  258.         r_nums = *this;
  259.         tp *t_numsPtr = new tp[numsLen + 1];
  260.         for (size_t i = 0; i < numsLen; i++)
  261.         {
  262.             *(t_numsPtr + i) = this->at(i);
  263.         }
  264.         *(t_numsPtr + numsLen) = num;
  265.         r_nums.numsLen++;
  266.         delete[] r_nums.numsPtr;
  267.         r_nums.numsPtr = t_numsPtr;
  268.     }
  269.     else
  270.     {
  271.         r_nums.numsLen = 1 + numsLen;
  272.         r_nums.numsPtr = new tp[numsLen + 1]{num};
  273.     }

  274.     return r_nums;
  275. }
  276. //11--合并对象
  277. template <typename tp>
  278. numbers<tp> numbers<tp>::operator+(const numbers<tp> &nums) const
  279. {
  280.     numbers<tp> t_nums;
  281.     if (numsPtr != nullptr)
  282.     {
  283.         t_nums = *this;
  284.         for (size_t i = 0; i < nums.numsLen; i++)
  285.         {
  286.             t_nums = t_nums + *(nums.numsPtr + i);
  287.         }
  288.     }
  289.     else
  290.     {
  291.         t_nums = nums;
  292.     }

  293.     return t_nums;
  294. }
  295. /*--------------------------------------------------------*/
  296. //12--判断数据在对象中是否存在
  297. template <typename tp>
  298. bool numbers<tp>::operator%(const tp num) const
  299. {
  300.     bool flag = false;
  301.     if (numsPtr != nullptr)
  302.     {
  303.         for (size_t i = 0; i < numsLen; i++)
  304.         {
  305.             if (num == *(numsPtr + i))
  306.             {
  307.                 flag = true;
  308.                 break;
  309.             }
  310.         }
  311.     }
  312.     return flag;
  313. }
  314. //13--判断子对象是否父对象的子串
  315. template <typename tp>
  316. bool numbers<tp>::operator%(const numbers<tp> &nums) const
  317. {
  318.     bool flag = false;
  319.     size_t count = 1;
  320.     if (numsLen > nums.numsLen)
  321.     {
  322.         for (size_t i = 0; i < nums.numsLen; i++)
  323.         {
  324.             if ((*this) % (*(nums.numsPtr + i)))
  325.             {
  326.                 count++;
  327.                 if (count == nums.numsLen)
  328.                 {
  329.                     break;
  330.                 }
  331.             }
  332.         }
  333.         if (count == nums.numsLen)
  334.         {
  335.             flag = true;
  336.         }
  337.     }
  338.     if (nums.numsPtr == 0)
  339.     {
  340.         flag = true;
  341.     }
  342.     return flag;
  343. }
  344. /*--------------------------------------------------------*/
  345. //14--返回数据出现的次数
  346. template <typename tp>
  347. size_t numbers<tp>::operator/(tp num) const
  348. {
  349.     size_t count = 0;
  350.     if (numsPtr != nullptr)
  351.     {
  352.         for (size_t i = 0; i < numsLen; i++)
  353.         {
  354.             if (this->at(i) == num)
  355.             {
  356.                 count++;
  357.             }
  358.         }
  359.     }
  360.     return count;
  361. }
  362. //15--返回两个对象共同的元素
  363. template <typename tp>
  364. numbers<tp> numbers<tp>::operator/(const numbers<tp> &nums) const
  365. {
  366.     numbers<tp> r_nums;
  367.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  368.     {
  369.         for (size_t i = 0; i < nums.numsLen; i++)
  370.         {
  371.             if ((*this)% (*(nums.numsPtr + i)))
  372.             {
  373.                 r_nums += (*(nums.numsPtr + i));
  374.             }
  375.         }
  376.     }
  377.     return r_nums;
  378. }
  379. /*--------------------------------------------------------*/
  380. //16--删除对象中符合条件的元素
  381. template <typename tp>
  382. numbers<tp> numbers<tp>::operator-(const tp num) const
  383. {
  384.     numbers<tp> r_nums;
  385.     if (numsPtr != nullptr)
  386.     {
  387.         for (size_t i = 0; i < numsLen; i++)
  388.         {
  389.             if (this->at(i) != num)
  390.             {
  391.                 r_nums += *(numsPtr + i);
  392.             }
  393.         }
  394.     }
  395.     return r_nums;
  396. }
  397. //17--删除父对象中与子对象中重复的元素
  398. template <typename tp>
  399. numbers<tp> numbers<tp>::operator-(const numbers<tp>& nums) const
  400. {
  401.     numbers<tp> r_nums;
  402.     size_t count = 0;
  403.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  404.     /*两个非空数字串*/
  405.     {
  406.         r_nums = *this;
  407.         for (size_t i = 0; i < nums.numsLen; i++)
  408.         {
  409.             if ((*this)%(*(nums.numsPtr + i)))
  410.             {
  411.                 r_nums = r_nums - *(nums.numsPtr + i);   
  412.             }     
  413.         }
  414.         if (r_nums.numsLen == 0)
  415.         {
  416.             delete [] r_nums.numsPtr;
  417.             r_nums.numsPtr = nullptr;
  418.         }
  419.     }
  420.     else if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))
  421.     /*子串为空*/
  422.     {
  423.         r_nums = *this;
  424.     }
  425.     return r_nums;
  426. }
  427. //18--按索引删除元素(数据必须是size_t类型)失败返回空串
  428. template <typename tp>
  429. numbers<tp> numbers<tp>::operator-(const size_t index) const
  430. {
  431.     numbers<tp> r_nums;
  432.     if ((index < numsLen ) && (numsPtr != nullptr))
  433.     {
  434.         for (size_t i = 0; i < index; i++)
  435.         {
  436.             r_nums = r_nums + *(numsPtr + i);
  437.         }
  438.         for (size_t i = index + 1; i < numsLen; i++)
  439.         {
  440.             r_nums = r_nums + *(numsPtr + i);
  441.         }
  442.     }
  443.     return r_nums;
  444. }
  445. //19-翻转数据的正负
  446. template <typename tp>
  447. numbers<tp> numbers<tp>::operator-(void) const
  448. {
  449.     numbers<tp> r_nums;
  450.     for (size_t i = 0; i < numsLen; i++)
  451.     {
  452.         r_nums += -*(numsPtr + i);
  453.     }
  454.     return r_nums;
  455. }
  456. #endif
复制代码


优化isnumbers()函数
  1. //0---判断是否是数字字符串
  2. template <typename tp>
  3. void numbers<tp>::isnumbers(const std::string &str)
  4. {
  5.     size_t s = str.size();
  6.     if (str[0] != '-' && (!isdigit(str[0])))
  7.     {
  8.         std::cerr << "Cannot convert to a valid number!" << std::endl;
  9.         exit(1);
  10.     }
  11.     if (str[0] == '-' || (isdigit(str[0])))
  12.     {
  13.         for (size_t i = 1; i < s; i++)
  14.         {
  15.             if (!isdigit(str[i]))
  16.             {
  17.                 std::cerr << "Cannot convert to a valid number!" << std::endl;
  18.                 exit(1);
  19.             }
  20.         }
  21.     }
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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