对象的单数组表示
(用单数组实现链表-不一样的链表实现)
#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;