Четверг, 09 Февраля 2023, 08:42

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Контейнеры в С++
Контейнеры в С++
ganstermДата: Воскресенье, 20 Мая 2012, 20:36 | Сообщение # 1
частый гость
Сейчас нет на сайте
У меня возникла небольшая проблема, необходимо обрабатывать N обьектов. Причем любой обьект можно удалить, добавить и тд. Можете обьяснить по поводу того как это реализовать?
НохчиДата: Воскресенье, 20 Мая 2012, 21:11 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
std::vector

Многие вопросы по Windows отпадут, если посмотреть тут
05142Дата: Воскресенье, 20 Мая 2012, 21:28 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Quote (gansterm)
любой обьект можно удалить, добавить

std::list же, хотя можно и вектор


mecinvader
ganstermДата: Воскресенье, 20 Мая 2012, 22:17 | Сообщение # 4
частый гость
Сейчас нет на сайте
А как добавлять классы в вектор?
vec.assign(1,new test()); нехочет.
warzesДата: Понедельник, 21 Мая 2012, 15:30 | Сообщение # 5
участник
Сейчас нет на сайте
Quote (gansterm)
vec.assign(1,new test()); нехочет.

почитать что-нибудь про STL вначале. Например книгу C++. Стандартная библиотека. Для профессионалов. Н.Джосьютис

Quote (gansterm)
А как добавлять классы в вектор?

Code

std::vector<MyClass*> myclasslist;

...

MyClass *mc = new MyClass();
// описываешь экземпляр (например инициализируешь)

myclasslist.push_back(mc);


Но вообще почитай книгу которую я тебе дал, там все по каждому контейнеру описано как заполнять, удалять, заменять, искать. И написано в виде справочника


Мой блог
Вики DirectX
ТехникДата: Вторник, 22 Мая 2012, 14:15 | Сообщение # 6
Глава X-ray Games
Сейчас нет на сайте
Чтобы добавить класс, сначала надо объявить вектор этого класса
Code

std::vector<CClass> mVecClass(MAX_SIZE);//MAX_SIZE = n(n - любое число)
//...
CClass* pClass = new CClass;
//добавление элемента в конец массива
mVecClass.push_back(&pClass);
DemeronДата: Вторник, 22 Мая 2012, 14:28 | Сообщение # 7
User created in C++
Сейчас нет на сайте
Вот небольшой шаблон класса из моего движка.

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;//освобождаем список и память которую он занимает



Сообщение отредактировал Demeron - Вторник, 22 Мая 2012, 14:37
ganstermДата: Вторник, 22 Мая 2012, 16:06 | Сообщение # 8
частый гость
Сейчас нет на сайте
Спасибо большое. Думаю дальше сам разберусь.
Форум игроделов » Программирование » C/C++ » Контейнеры в С++
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2023 Рейтинг