Вот небольшой шаблон класса из моего движка.
Code
template<class _Ty> class elist
{
public:
_Ty* mem;
bool* bmem;
int now;//count
int step;//step count
int pn;//optimize
_Ty* operator [](int _Index)
{
if (_Index==-1 || !bmem[_Index]) return NULL; else return &mem[_Index];
}
void create(int _Count=100,int _Step=50)
{
_null();
_resize(_Count);
step=_Step;
}
int add(const _Ty& _Item)
{
int f;
bool b;
f=pn;
b=false;
for (int i=f;i<now;i++)
{
if (bmem[i]==0)
{
//memcpy((void*)&mem[i],(void*)&_Item,sizeof(_Ty));
mem[i]=_Item;
bmem[i]=1;
pn=i;
return i;
}
if (i+1==now) {if (b) {_resize();pn=i;} else {b=true;i=0;} continue;}
}
return -1;
}
void del(int _Index)
{
bmem[_Index]=0;
}
void delall()
{
for (int i=0;i<now;i++)
bmem[i]=0;
}
void _free()
{
if (mem) free(mem);
if (bmem) free(bmem);
_null();
}
int count()
{
return now;
}
bool empty(int _Index)
{
if (_Index<0 || _Index>=now) return 1;
return !bmem[_Index];
}
void _null()
{
mem=0;
bmem=0;
now=0;
pn=0;
}
void _resize(int _Step)
{
bmem=(bool*)realloc(bmem,sizeof(bool)*(now+_Step));
for (int j=now;j<now+_Step;j++)
bmem[j]=false;
now+=_Step;
mem=(_Ty*)realloc(mem,now*sizeof(_Ty));
}
void _resize()
{
_resize(step);
}
};
Пример использования:
Code
struct sample//структура для примера
{
int a;
int b;
float z;
};
elist<sample> list;//объявляем список
int count;//начальное количество элементов
int step;//количество добавляемых элементов когда мест хватать не будет
list.create(count,step);//создаем список
sample s;//пример
s.a=2;
s.b=11;
s.z=1.01f;
int ItemID=list.add(s);//добавляем пример в список и записываем его ID в ItemID
sample* gs;
gs=list[ItemID];//получаем указатель на элемент
if (!gs)//если элемента не существует
{
}
list.del(ItemID);//удаляем ячейку с ID==ItemID
list._free;//освобождаем список и память которую он занимает