#ifndef PersonSet_hpp
#define PersonSet_hpp
#include <iostream>
#include "Person.hpp"
using namespace std;
class PersonSet
{
public:
Person **p;
int _size;
int capacity;
int index;
public:
PersonSet();
void add(Person& _p);
~PersonSet();
int size();//得到实际的个数
void Reset();
Person&NextElement();
Person& operator[](int x);//重载下标运算符
Person& operator[](int x)const;
Person &shuchuxia(int index3);
Person &shuchuxia1();
void shuchuxia2();
void clearVoters();
};
#endif /* PersonSet_hpp */
#include "PersonSet.hpp"
PersonSet::PersonSet()
{
_size=0;
capacity=4;
index=0;
p=new Person* [capacity];
for (int i=0; i<_size; ++i)
{
p[i]=NULL;
}
}
void PersonSet::add(Person& _p)
{
if (_size>capacity/2)
{
Person **temp=p;
this->p=new Person*[this->capacity*2];
for (int i=0; i<_size; ++i)
{
this->p[i]=temp[i];
}
capacity*=2;
for (int i=_size; i<this->capacity; ++i)
{
this->p[i]=NULL;
}
delete [] temp;
}
p[_size++]=&_p;
}
PersonSet::~PersonSet()
{
if (p!=NULL)
{
delete [] p;
p=NULL;
}
}
void PersonSet::Reset()
{
this->index=0;
}
Person&PersonSet::NextElement()
{
return *this->p[index++];
}
int PersonSet::size()//得到实际的个数
{
return _size;
}
Person& PersonSet::operator[](int x)//重载下标运算符
{
return *(p[x]);
}
Person& PersonSet::operator[](int x)const//重载下标运算符
{
return *(p[x]);
}
Person &PersonSet::shuchuxia(int index3)
{
Person*per= this->p[index3];
for (int i=index3;i<_size; ++i)
{
p[i]=p[i+1];
}
if (_size<capacity/2)
{
Person **temp=p;
this->p=new Person*[this->capacity/2];
for (int i=0; i<_size; ++i)
{
this->p[i]=temp[i];
}
capacity/=2;
for (int i=_size; i<this->capacity; ++i)
{
this->p[i]=NULL;
}
delete [] temp;
}
--_size;
return *per;
}
Person & PersonSet::shuchuxia1()
{
if (_size<capacity/2)
{
Person **temp=p;
this->p=new Person*[this->capacity/2];
for (int i=0; i<_size; ++i)
{
this->p[i]=temp[i];
}
capacity/=2;
for (int i=_size; i<this->capacity; ++i)
{
this->p[i]=NULL;
}
delete [] temp;
}
Person *per =p[--_size];
return *per;
}
void PersonSet::shuchuxia2()
{
int aa=_size;
for (int i=aa; i>0; --i)
{
p[i]=NULL;
_size--;
}
}
void PersonSet::clearVoters()
{
if (_size!=0)
{
int a=_size;
for (int i=0;i<a;++i)
{
p[i]=NULL;
}
_size=0;
index=0;
}
}