|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 bin554385863 于 2019-11-19 22:56 编辑
这是我对照C++string写的一个数字串的类
重载的加号是用来拼接的,不知道为啥会出现数字溢出,
numbers.h
- #ifndef NUMBERS_H
- #define NUMBERS_H
- #include <iostream>
- #include <initializer_list>
- template <typename tp>
- class numbers
- {
- private:
- tp *NUM;
- size_t LENGTH;
- public:
- numbers(const tp *carray, size_t sz);//数组构造
- numbers() : LENGTH(0), NUM(nullptr) {} //默认构造*****
- numbers(std::initializer_list<tp> list); //普通构造*****
- numbers(numbers<tp> &arr); //复制构造*****
- void pushback(const tp data); //尾部插入元素*****
- size_t size(); //数字串的大小*****
- tp &operator[](const size_t i); //重载索引下标符号[]*****
- size_t find(tp num); //在对象中查找一个元素,返回索引*****
- bool find(numbers<tp> &nums); //在对象中查找另一个对象,返回bool值*****
- numbers<tp> operator+(numbers<tp>& nums);//拼接
- numbers<tp> operator-(numbers<tp>& nums);//删除于第二个对象相同的元素
- numbers<tp> operator-(tp num);//删除与num相同的元素
- friend std::ostream &operator<<(std::ostream &os, numbers<tp> &arr)
- //重载输出流符号<<
- {
- for (size_t i = 0; i < arr.size(); i++)
- {
- os << arr[i];
- }
- return os;
- }
- //析构函数
- ~numbers();
- };
- #endif
复制代码
numbers.cpp
- #include "numbers.h"
- template <typename tp>
- numbers<tp>::numbers(const tp *carray, size_t sz) : LENGTH(sz) //数组构造
- {
- NUM = new tp[LENGTH]{0};
- for (size_t i = 0; i < LENGTH; i++)
- {
- *(NUM + i) = carray[i];
- }
- }
- template <typename tp>
- numbers<tp>::numbers(std::initializer_list<tp> list) : LENGTH(list.size())
- //普通构造
- {
- NUM = new tp[LENGTH];
- for (size_t i = 0; i < LENGTH; i++)
- {
- NUM[i] = *(list.begin() + i);
- }
- }
- template <typename tp>
- numbers<tp>::numbers(numbers<tp> &arr) //复制构造
- {
- LENGTH = arr.LENGTH;
- NUM = new tp[LENGTH];
- for (size_t i = 0; i < LENGTH; i++)
- {
- *(NUM + i) = arr[i];
- }
- }
- template <typename tp>
- void numbers<tp>::pushback(const tp data) //尾部插入元素
- {
- tp *t_NUM = new tp[LENGTH + 1];
- for (size_t i = 0; i < LENGTH; i++)
- {
- t_NUM[i] = NUM[i];
- }
- t_NUM[LENGTH] = data;
- LENGTH += 1;
- delete[] NUM;
- NUM = t_NUM;
- }
- template <typename tp>
- size_t numbers<tp>::size() //取得对象的大小
- {
- return LENGTH;
- }
- template <typename tp>
- tp &numbers<tp>::operator[](const size_t i) //重载索引符[]
- {
- return NUM[i];
- }
- template <typename tp>
- size_t numbers<tp>::find(const tp num) //在对象里查找元素num是否存在
- //如果存在则返回出现的次数,否则返回0
- {
- size_t count = 0;
- for (size_t i = 0; i < LENGTH; i++)
- {
- if (num == NUM[i])
- {
- count++;
- }
- }
- return count;
- }
- template <typename tp>
- bool numbers<tp>::find(numbers<tp> &nums) //查找子对象的元素是否存在于父对象中
- {
- bool flag = true;
- if (nums.LENGTH > LENGTH)
- {
- flag = false;
- }
- else
- {
- unsigned int count = 1;
- for (size_t i = 0; i < nums.LENGTH; i++)
- {
- if (this->find(nums.NUM[i]))
- {
- count++;
- }
- else
- {
- flag = false;
- break;
- }
- }
- if (count == nums.LENGTH)
- {
- flag = true;
- }
- }
- return flag;
- }
- template <typename tp>
- numbers<tp> numbers<tp>::operator+(numbers<tp>& nums)
- {
- numbers<tp> result(NUM, LENGTH);
- for (size_t i = 0; i < nums.size(); i++)
- {
- result.pushback(nums[i]);
- }
- std::cout<<result;
- return result;//在这里已经拼接成功
- }
- template <typename tp>
- numbers<tp>::~numbers() //析构函数
- {
- delete[] NUM;
- }
- int main(int argc, char const *argv[])
- {
- int arr[4] = {1, 2, 3, 4};
- numbers<int> nums(arr, 4);
- numbers<int> a = {5, 6, 7};
- numbers<int> b;
- b = a+nums;
- std::cout<<b;//这里输出乱码
- return 0;
- }
复制代码
你不写,编译器的确会为你写一个,但是编译器为你写的这个版本是进行浅拷贝,在这里必须进行深拷贝
所以这里不能用编译器的默认版本,你必须提供你自己的版本
|
|