对象的单数组表示

(用单数组实现链表-不一样的链表实现)

#ifndef C11LEARN_SINGULARGROUPSREPRESENTOBJECTS_H
#define C11LEARN_SINGULARGROUPSREPRESENTOBJECTS_H
#include "cmath"
#include "../tools/tool.h"
template<typename T>
class SingularGroupsRepresentObjects
{private:int head;int tail;char * buffer;int capacity;int unit;int size;
public:SingularGroupsRepresentObjects(int capacity = 50);virtual ~SingularGroupsRepresentObjects();SingularGroupsRepresentObjects(const SingularGroupsRepresentObjects<T> & l);const SingularGroupsRepresentObjects<T> & operator=(const SingularGroupsRepresentObjects<T> &l);T operator[](int index) const;T & operator[](int index);void add(T key);int search(const T &key);bool remove(const T &key);bool full();bool empty();int length() const;
};
template<typename T>
SingularGroupsRepresentObjects<T>::SingularGroupsRepresentObjects(int capacity):capacity(capacity){if(this->capacity<50) this->capacity = 50;unit = (sizeof (int))*2 + sizeof(T);buffer = new char [unit*capacity];memset(buffer,0,unit*capacity);head = tail = -1;
}
template<typename T>
SingularGroupsRepresentObjects<T>::~SingularGroupsRepresentObjects(){if(buffer!= nullptr){delete[] buffer;buffer = nullptr;}
}
template<typename T>
SingularGroupsRepresentObjects<T>::SingularGroupsRepresentObjects(const SingularGroupsRepresentObjects<T> & l){capacity = l.capacity;unit = l.unit;buffer = new char [unit*capacity];head = l.head;tail = l.tail;size = l.size;memcpy(buffer,l.buffer,unit*capacity);
}
template<typename T>
const SingularGroupsRepresentObjects<T> & SingularGroupsRepresentObjects<T>::operator=(const SingularGroupsRepresentObjects<T> &l){if(this == &l)return *this;if(buffer!= nullptr){delete[] buffer;}capacity = l.capacity;unit = l.unit;buffer = new char [unit*capacity];head = l.head;tail = l.tail;size = l.size;memcpy(buffer,l.buffer,unit*capacity);return *this;
}
template<typename T>
T SingularGroupsRepresentObjects<T>::operator[](int index) const{if(index<0 || index >= size)throw "out of bound";int current = index;while (current-->0){current = *(int*)(buffer+current*unit+sizeof(int));}return *(T*)(buffer+current*unit+sizeof(int)*2);
}
template<typename T>T & SingularGroupsRepresentObjects<T>::operator[](int index){if(index<0 || index >= size)throw "out of bound";int current = head;while (index-->0){current = *(int*)(buffer+current*unit+sizeof(int));}return *(T*)(buffer+current*unit+sizeof(int)*2);
}
template<typename T>
void SingularGroupsRepresentObjects<T>::add(T key){if(full())return;if(head == -1){int *prev= new (buffer)int;*prev = -1;int *next = new(buffer+sizeof(int))int;*next = -1;T* t = new(buffer+sizeof(int)*2)T;*t=key;size = 1;head = tail = 0;}else{int index = 0;while (index<capacity){if(*(int*)(buffer+index*unit) ==0&& (*(int*)(buffer+index*unit+sizeof(int))) ==0)break;index++;}*(int*)(buffer+tail*unit+sizeof(int)) = index;int *prev = new (buffer+index*unit)int;*prev = tail;int *next = new (buffer+index*unit + sizeof(int))int;*next = -1;T * t = new (buffer+index*unit + sizeof(int)*2)T;*t = key;tail = index;size++;}
}
template<typename T>
int SingularGroupsRepresentObjects<T>::search(const T &key){if(empty()) return -1;int current =  head;while (current!=-1 && *(T*)(buffer + current * unit + sizeof (int)*2) != key){current = *(int*)(buffer+current*unit+sizeof (int));}return current;
}
template<typename T>
bool SingularGroupsRepresentObjects<T>::remove(const T &key){int index = search(key);if(index == -1) return false;int prev = *(int*)(buffer+index*unit);int next = *(int*)(buffer + index * unit + sizeof(int));if(prev == -1){head = next;}else{*(int*)(buffer + prev * unit + sizeof(int)) = next;}if(next == -1){tail = prev;}else{*(int*)(buffer + next * unit) = prev;}memset(buffer+index*unit,0,unit);size--;return true;
}
template<typename T>
bool SingularGroupsRepresentObjects<T>::full(){return size == capacity;
}
template<typename T>
bool SingularGroupsRepresentObjects<T>::empty(){return size == 0;
}
template<typename T>
int SingularGroupsRepresentObjects<T>::length() const{return size;
}
#endif //C11LEARN_SINGULARGROUPSREPRESENTOBJECTS_H

测试代码

     int arr[] = {1, 4, 6, -9, 2, -5, 10, -3, -7,12};int length = sizeof(arr)/sizeof (int);SingularGroupsRepresentObjects<int> singularGroupsRepresentObjects;for (int i = 0; i < length; ++i) {singularGroupsRepresentObjects.add(arr[i]);}for (int i = 0; i < length; ++i) {cout<<singularGroupsRepresentObjects.search(arr[i])<<" ";}cout<<endl;singularGroupsRepresentObjects[9] = 110;for (int i = 0; i < singularGroupsRepresentObjects.length(); ++i) {cout<<singularGroupsRepresentObjects[i]<<" ";}cout<<endl;for (int i = 0; i < length/2; ++i) {cout<<singularGroupsRepresentObjects.remove(arr[i])<<" ";}cout<<endl;for (int i = 0; i < singularGroupsRepresentObjects.length(); ++i) {cout<<singularGroupsRepresentObjects[i]<<" ";}cout<<endl;SingularGroupsRepresentObjects<int> singularGroupsRepresentObjects_b = singularGroupsRepresentObjects;SingularGroupsRepresentObjects<int> singularGroupsRepresentObjects_c;singularGroupsRepresentObjects_c = singularGroupsRepresentObjects_b;for (int i = 0; i < singularGroupsRepresentObjects_b.length(); ++i) {cout<< singularGroupsRepresentObjects_b[i]<<" ";}cout<<endl;for (int i = 0; i < singularGroupsRepresentObjects_c.length(); ++i) {cout<< singularGroupsRepresentObjects_c[i]<<" ";}for (int i = 0; i < singularGroupsRepresentObjects_c.length(); ++i) {singularGroupsRepresentObjects_c[i] = singularGroupsRepresentObjects_c[i] + arr[i];}cout<<endl;for (int i = 0; i < singularGroupsRepresentObjects_c.length(); ++i) {cout<< singularGroupsRepresentObjects_c[i]<<" ";}cout<<endl;

对象的单数组表示(用单数组实现链表-不一样的链表实现)相关推荐

  1. 无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满问题处理方式

    今天公司同事反馈,在手机APP端进行业务操作时,提示无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满,如下所示. 出现这个问题的原因是数据库中设置了Log日志限制了文件增长.设置如下所示 ...

  2. 无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满

    用SQL Server2012,做数据保存时出错,错误信息:无法为数据库'***'中的对象'***'分配空间,因为'PRIMARY'文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到 ...

  3. 【解决方法】因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间

    文章目录 平台 问题描述 解决问题 1.查看数据库数据文件存放路径 2.查看存放路径的盘是否已满 3.更改数据库设置 平台 sqlserver 2012 问题描述 正常运行的生产系统,今天下午突然发现 ...

  4. JIPB:白洋组综述根系微生物组群落构建及其对植物适应性的贡献

    根系微生物组:群落构建及其对植物适应性的贡献 The root microbiome: Community assembly and its contributions to plant fitnes ...

  5. Windows server 2003域下全局组、本地域组及通用组之间的关系详解

    WINDOWS SERVER 2003 组的简介: 定义: 组(Group)是用户帐号的集合. 作用: 通过向一组用户分配权限从而不必向每个用户分配权限,简化管理.就是为用户和嵌套在里面的组等单元提供 ...

  6. 全局组、域本地组、通用组到底有什么区别?它们之间的关系如何?

    全局组:可以全局使用.即:可在本域和有信任关系的其它域中使用,体现的是全局性.MS建议的规则:基于组织结构.行政结构规划. 域本地组:只能在本域的域控制器DC上使用.MS建议的规则:基于资源(夹.打印 ...

  7. java 线程组作用_Java线程组(ThreadGroup)使用

    JDK 对线程组类注释: A thread group represents a set of threads. In addition, a thread group can also includ ...

  8. 云服务器 ECS > 安全 > 安全组 > 添加安全组规则

    添加安全组规则 更新时间:2020-07-01 16:03:49 编辑我的收藏 本页目录 前提条件 背景信息 操作步骤 执行结果 后续步骤 相关文档 您可以通过添加安全组规则,允许或禁止安全组内的EC ...

  9. 本计算机家庭组的用户名,家庭组

    家庭组是家庭网络上可以共享文件和打印机的一组计算机.使用家庭组可以使共享变得比较简单.您可以与家庭组中的其他人共享图片.音乐.视频.文档和打印机.其他人不能更改您共享的文件,除非您为他们提供了执行此操 ...

最新文章

  1. Qt之两种初始化QListWidget的方法
  2. 服务器管理神器 开源堡垒机 jumpserver 实战教程
  3. 关于程序员之间丧心病狂的鄙视链——编程语言篇
  4. 如何高效学习java呢?
  5. json处理最外层引号
  6. php实现身份证号码获取归属地地址的实列教程,含完整全国地区归属数据!
  7. java 水印 位置_Java实现图片加水印且控制位置和透明度
  8. JDK1.8网盘链接
  9. ThinkPHP实现登陆功能
  10. Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系
  11. 高赞 GitHub 项目盘点:给力的 Spring 教程
  12. PMP第六版5大过程组49个过程
  13. YYText识别链接和点击事件
  14. Java的LocalDateTime与mysq的datatime数据类型匹配不了
  15. 2020-11-16学习总结: sass配置
  16. 我的日程安排表 II
  17. Faker最新仓库地址更新 4/6
  18. 【seo】seo网站优化过程
  19. wow服务器合并信息,WOW魔兽世界5月21日大服务合并维护 二区合并至电信区
  20. 极客日报:腾讯下一步或减持美团和拼多多的股份;iPhone 13连续6周成中国最畅销智能手机;Linux 5.16 开发者统计

热门文章

  1. Android之获取到音视频的时长后按格式(00:00或者00:00:00)显示
  2. IOS之学习笔记十四(协议的定义和实现)
  3. vue 获取url地址的参数_2020年 vue常见面试问题总结(干货)!
  4. matlab读取文件夹下所有文件的字符串,MATLAB读取文件夹下所有文件的文件名并读取数据...
  5. axure如何导出原件_axure导出_axure怎么导出流程图
  6. bootstrapt 表格自适应_一起聊B端设计 - 如何设计表格?
  7. “Python简直万能!”拜托快醒醒!
  8. 快速入门深度学习,其实并不难!
  9. 程序员为啥365天都背电脑包?这答案我服!
  10. 干货|吴恩达Coursera课程教你学习神经网络二!