动态数组的模板类/求指定个数的素数
来源:互联网 发布:plc梯形图编程规则 编辑:程序博客网 时间:2024/06/06 00:29
1.动态数组的模板类
#ifndef CARRAY_INCLUDE_H#define CARRAY_INCLUDE_H#include <cassert>template <class T> class CArray{ //数组类模板的定义private:T* list; //用于存放动态分配的数组内存首地址int size; //数组的大小(元素的个数)public:CArray(int sz = 50); //构造函数CArray(const CArray<T> &a); //复制构造函数~CArray(); //析构函数CArray<T>& operator=(const CArray<T> &rhs); //重载"="运算符T& operator[](int i); //重载"[]"下标运算符const T& operator[](int i)const; //重载“[]”为常函数(只读)operator T*(); //重载指针运算符operator const T*()const;int GetSize() const; //获取数组的大小void ReSize(int sz); //修改数组的大小};/*构造函数*/template <class T> CArray<T>::CArray(int sz){assert(sz >= 0); //sz为数组大小(元素个数),应当非负size = sz; list = new T[size]; //动态分配size个T类型的元素空间}/*析构函数*/template <class T> CArray<T>::~CArray(){delete [] list;}/*拷贝构造函数*/template <class T> CArray<T>::CArray(const CArray<T> &a){size = a.size; //从对象x取得数组的大小,并赋值给当前对象的size成员list = new T[size]; //动态分配a.size个T类型的元素空间for (int i = 0; i < size; i++){list[i] = a.list[i]; //将对象a的所有元素赋值到本对象}}/*重载“=”运算符,将对象rhs赋值给本对象,实现整体赋值*/template < class T>CArray<T> &CArray<T>::operator=(const CArray<T>& rhs){if (&rhs != this){if (size != rhs.size) //如果对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配{delete[] list; //设置本对象的数组大小size = rhs.size; //设置本对象的数组大小list = new T[size]; //重新分配size大小的数组空间}for (int i = 0; i < size; i++){list[i] = rhs.list[i]; //将数组rhs中的元素依次复制到本对象中}}return *this; //返回当前对象的引用}/*重载“[]”下标运算符,实现与普通数组一样可通过下标访问元素,并且具有越界检查功能*/template < class T> T& CArray<T>::operator[](int n){assert(n >= 0 && n < size); //检查数组下标是否越界return list[n]; //返回下标n的数组元素}/*重载下标运算符[]*/template <class T>const T& CArray<T>::operator[](int n)const{assert(n >= 0 && n < size); //检查数组下标是否越界return list[n]; //返回下标为n的数组元素}/*重载指针转换运算符*,将CArray类的对象名转换为T类型的指针*/template <class T>CArray<T>::operator T*(){return list; //返回当前对象中私有数组的首地址}/*重载指针转换运算符**//*template <class T>const CArray<T>::operator T*()const{return list;}*//*获取当前数组的大小*/template <class T> int CArray<T>::GetSize()const{return size;}/*将数组大小修改为sz*/template <class T>void CArray<T>::ReSize(int sz){assert(sz >= 0); //检查sz是否为0if (sz == szie) //如果指定的大小与原有数组大小相同,则什么也不做,返回return;T* newList = new T[sz]; //动态分配新数组,大小为szint n = (sz < size) ? sz : size; //n取sz和size中较小值for (int i = 0; i < n; i++){newList[i] = list[i]; //将原有数组list中的n个值复制到新数组中}delete[] list; //删除原有数组list = newList; //使list指向新数组size = sz; //更新size的值}#endif
测试代码:
#include <iostream>#include "CArray.h"using namespace std;void read(int *p, int n); //如果没有指针转换运算符,该函数将失效void read(int *p, int n){for (int i = 0; i < n; i++)cin >> p[i];}int main() {CArray<int> a(10);read(a, 10);cout << a[5] << endl;return 0;}
运行结果如图:
2.求范围2~N中的质数,N在程序运行时由键盘输入。
测试代码:
#include <iostream>#include <iomanip>#include "CArray.h"using namespace std;int main() {CArray<int> a(10); //用来存放质数的数组,初始状态有十个元素int n, count = 0;cout << "Enter a value >= 2 as upper limit for prime number: ";cin >> n;//检查i是否能被比它小的质数整除for (int i = 2; i <= n; i++) {bool isPrime = true;for (int j = 0; j < count; j++){//若i被a[j]整除,说明i不是质数if (i%a[j] == 0){isPrime = false;break;}}if (isPrime){if (count == a.GetSize())a.ReSize(count * 2); //扩容,当需要扩容时成倍的递增a[count++] = i;}}for (int i = 0; i < count; i++)cout << setw(8) << a[i];cout << endl;return 0;}
测试用例:
来自清华大学MOOC课件
0 0
- 动态数组的模板类/求指定个数的素数
- 求素数的个数
- 求小于n的素数个数(模板)
- sdut1585 求素数的个数
- 反素数 模板 求因子的个数为n的最小的数是什么
- 求一千万以内的素数的个数
- 动态数组求n个数的和还有平均数 --- 蓝桥杯
- hdu4417 树状数组(求指定区间比指定数小的数的个数)
- 求每隔1000素数的个数
- 求一定范围内的素数个数
- 求1亿内的素数个数
- 求100以内的素数以及个数
- 求一定范围内素数的个数
- 求n以内的素数个数问题
- 求一段区间内素数的个数
- 求某个数范围内的素数个数
- 求1e11以内的素数个数
- 求 1~n 之间素数的个数
- Apache的配置技巧
- JdbcTemplate + sqlserver 2005 分页+Extjs
- nginx配置tomcat与配置rewrite。
- 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
- Android取消标题栏&强制设置横(竖)屏方法
- 动态数组的模板类/求指定个数的素数
- 黑马程序员----面象对象及封装
- android学习笔记(二)布局
- AlphaAnimation无效
- ethercat Mark一下,后续在写
- 回顾系列2-部落战争
- tfs 安装相关问题
- Java中的instanceof关键字
- iOS唯一标示符引导