C++基础学习笔记:自定义数组模板类
2017-09-14 13:22
351 查看
//!时间:2017年9月12日(周二)下午 //!内容:数组模板类 /* 修改:2017年9月13上午 成员方法中delete未正确匹配 改进:2017年9月13晚上 数组总量改为固定 */ #define _CRTDBG_MAP_ALLOC #include <iostream> #include <string> #include "ArrayTemplate.h" #include "Arr.h" #include <ctime> int main() { using namespace std; { clock_t one = clock(); Arr<int, 1> testOne(1); for (int i = 0; i < 10000; i++) { testOne.Add(5, 1); } clock_t two = clock(); Array<int, 1> testTwo(1); for (int i = 0; i < 10000; i++) { testTwo.Add(5, 1); } clock_t three = clock(); cout << "Add(5, 1)*10000固定大小arr: " << (double)(two - one) / CLOCKS_PER_SEC << endl; cout << "Add(5, 1)*10000不固定Array: " << (double)(three - two) / CLOCKS_PER_SEC << endl<<endl; cout << "测试int:" << endl; cout << "声明一个长度为5的int型数组并赋值:"; Arr<int, 5> test; for (int i = 0; i < test.Size(); i++) { test[i] = i; cout << " " << test[i]; } cout << endl << "间隔插入数字6:"; for (int i = 5; i >= 0; i--) { test.Add(6,i); } for (int i = 0; i < test.Size(); i++) { cout << " " << test[i]; } cout << endl << "第一个数字4位于:位" << test.Search(4); test.Delete(9);//删除位9的4 test.Reset(4, 2);//将位2设置为4 cout << endl << "Reset(4, 2)后4位于:位" << test.Search(4) << endl << endl; cout << "测试char *:" << endl; cout << "声明一个长度为3的char型数组并赋值:\n"; Arr<char *, 3> str("aa"); for (int i = 0; i < str.Size(); i++) { cout << str[i]<<" "; } str.Add("add"); str.Reset("reset", 1); cout << "\n现在数组内容为:\n"; for (int i = 0; i <str.Size(); i++) { cout << str[i]<<" "; } cout << endl<<endl<<"测试string:\n"; Arr<string, 3> ss("string"); for (int i = 3; i >= 0; i--) { ss.Add("aa", i); } ss.Reset("111", 1); for (int i = 0; i <ss.Size(); i++) { cout << ss[i] << endl; } cout << endl; } system("pause"); _CrtDumpMemoryLeaks(); return 0; }
#pragma once template <typename T, int n> class Arr { private: static const int LIMIT = 11000; int count = n; T *arr; public: Arr()//构造 { if (n > LIMIT) throw "丢一个异常"; arr = new T[LIMIT]; } explicit Arr(const T&t)//构造 { if (n > LIMIT) throw "丢一个异常"; arr = new T[LIMIT]; for (int i = 0; i < n; i++) arr[i] = t; } ~Arr()//析构 { delete[]arr; } //下标访问 T&operator[](int i); //插入or增加一个元素 bool Add(const T&t, int i = -1); //删除某个元素 bool Delete(int i = -1); //重置某个元素 bool Reset(const T&t, int i); //查询某个元素第一个下标 int Search(const T&t); //查询数组长度 int Size(); }; template <typename T, int n> T& Arr<T, n>::operator[](int i) { if (i<0 || i >= count) { throw "out of limits"; } return arr[i]; } template <typename T, int n> bool Arr<T, n>::Add(const T&t, int i) { if (count + 1 > LIMIT) { return false; } else if (i < 0 || i >= count) { count++; arr[count - 1] = t; return true; } else if (i >= 0 && i<count) { count++; for (int x = count - 1; x > i; x--) arr[x] = arr[x - 1]; arr[i] = t; return true; } else return false; } template <typename T, int n> bool Arr<T, n>::Delete(int i) { if (i < 0 && count>0) { count--; return true; } else if (i >= 0 && count>0 && i<count) { count--; for (int x = i; x < count; x++) arr[x] = arr[x + 1]; return true; } else return false; } template <typename T, int n> bool Arr<T, n>::Reset(const T&t, int i) { if (i >= 0 && i < count) { arr[i] = t; return true; } else return false; } template <typename T, int n> int Arr<T, n>::Search(const T&t) { for (int i = 0; i<count; i++) if (arr[i] == t) { return i; } return -1; } template <typename T, int n> int Arr<T, n>::Size() { return count; }
//!使用模板实现一个自定义的数组类, //!能够新增、修改、删除、使用下标访问数据、 //!根据数据返回数据组中第一个符合的小标、 //!获取数组中当前存储的数据个数 #pragma once #include <iostream> template <typename T, int n> class Array { private: int count=n; T *ar; T *temp; public: int theN() { return n; } Array() { ar = new T[count]; temp = nullptr; } explicit Array(const T&t);//初始化为同一个数值 ~Array() { delete[]ar; ar = nullptr; if (nullptr!=temp) { delete[]temp; } temp = nullptr; } //下标访问 T&operator[](int i); //插入or增加一个元素 bool Add(const T&t, int i = -1); //重置某个元素 bool Reset(const T&t,int i); //删除某个元素 bool Delete(int i=-1); //查询某个元素第一个下标 int Search(const T&t); //查询数组长度 int Size(); }; template <typename T, int n> Array<T, n>::Array(const T&t) { ar = new T[count]; for (int i = 0; i < n; i++) ar[i] = t; } template <typename T, int n> T& Array<T, n>::operator[](int i) { if (i<0||i >= count) { throw "out of limits"; } return ar[i]; } template <typename T, int n> bool Array<T, n>::Add(const T&t,int i) { if (i < 0||i>=count ) { count++; temp = new T[count]; for (int x = 0; x < count-1; x++) temp[x] = ar[x]; delete []ar; ar = new T[count]; for (int x = 0; x < count-1; x++) ar[x] = temp[x]; ar[count - 1] = t; delete []temp; temp = nullptr; return true; } else if (i >= 0 && i<count) { count++; temp = new T[count]; for (int x = 0; x <i; x++) temp[x] = ar[x]; temp[i] = t; for (int x = i+1; x<count; x++) temp[x] = ar[x-1]; delete []ar; ar = new T[count]; for (int x = 0; x < count; x++) ar[x] = temp[x]; delete []temp; temp = nullptr; return true; } else return false; } template <typename T, int n> bool Array<T, n>::Reset(const T&t,int i) { if (i >= 0 && i < count) { ar[i] = t; return true; } else return false; } template <typename T, int n> bool Array<T, n>::Delete( int i) { if (i < 0&&count>0) { count--; temp = new T[count]; for (int x = 0; x < count; x++) temp[x] = ar[x]; delete []ar; ar = new T[count]; for (int x = 0; x < count; x++) ar[x] = temp[x]; delete []temp; temp = nullptr; return true; } else if(i>=0&&count>0&&i<count) { count--; temp = new T[count]; for (int x = 0; x < i; x++) temp[x] = ar[x]; for(int x=i;x<count;x++) temp[x] = ar[x+1]; delete []ar; ar = new T[count]; for (int x = 0; x < count; x++) ar[x] = temp[x]; delete []temp; temp = nullptr; return true; } else return false; } template <typename T, int n> int Array<T, n>::Search(const T&t) { for(int i=0;i<count;i++) if (ar[i] == t) { return i; } //?throw "not find"; return -1; } template <typename T, int n> int Array<T, n>::Size() { return count; }
相关文章推荐
- C\C++ 程序员从零开始学习Android - 个人学习笔记(四) - java基础 - 数据类型、变量、字符串、数组
- C++基础教程 学习笔记(二) 数组、字符串和指针
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- C/C++ 基础知识学习笔记 (不断更新中)
- C++基础(学习笔记)
- C/C++学习笔记:指针与数组
- 《面向对象基础:C++实现》学习笔记之六
- C++基础教程 学习笔记(一) C++的数据类型和修饰符
- C++/GDI+ 学习笔记(三)——基础
- C++学习笔记---------基础知识sizeof用法
- C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
- 《面向对象基础:C++实现》学习笔记之一
- C++学习笔记(一)--基础知识sizeof用法
- c++学习笔记(数组)
- 《面向对象基础:C++实现》学习笔记之三
- c++学习笔记2——指向字符串的指针数组?
- C++学习笔记(四)——数组和指针
- 《面向对象基础:C++实现》学习笔记之七
- 学习笔记-C++搞Mobile基础
- 《面向对象基础:C++实现》学习笔记之八