forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Создание динамического массива объектов класса (http://forum.boolean.name/showthread.php?t=8075)

Aceton 28.03.2009 23:52

Создание динамического массива объектов класса
 
Вообщем погуглил ... и пришол к выводу что такое только реально сделать через указатели, но это очень тормозное решение.

В итоге думаю сделать скажем изначально массив [16], и потом если надо будет еще что то добавить просто сделаю удвоение размера этого же массива - П,С, - думаю лагать не будет и быстрее указателей

HolyDel 29.03.2009 00:05

Ответ: Создание динамического массива объектов класса
 
Цитата:

Вообщем погуглил ... и пришол к выводу что такое только реально сделать через указатели, но это очень тормозное решение.
любой динамический массив делается через указатели.

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

Aceton 29.03.2009 00:30

Ответ: Создание динамического массива объектов класса
 
судя по тестам обычный массив работает на порядок быстрее, realloc и vector кто юзал?

или может вообще пихать в структуру

jimon 29.03.2009 01:22

Ответ: Создание динамического массива объектов класса
 
Aceton
прочитай хотя бы какую-то книжку для начинающих по C++, рекомендую "C++ за 21 день"
сразу все такие вопросы отпадут, или хотя бы удостоверся что точно и полностью понимаешь что такое обьект, а что такое указатель на обьект, а что такое класс и что такое масив
если тебе плевать на учёбу и нужен результат тут и сразу - используй std::vector

Aceton 29.03.2009 14:17

Ответ: Создание динамического массива объектов класса
 
не принимай меня за полного нуба))) я прекрасно понимаю что это все значит, просто 5 лет работал на php и прочив веб вещах, сишнег знаю выше уровня нуба:crazy:

HolyDel 29.03.2009 15:03

Ответ: Создание динамического массива объектов класса
 
Вложений: 1
Цитата:

сишнег знаю выше уровня нуба
везет тебе. я тоже хочу знать выше уровня нуба.

Это:
Код:

#include <iostream>
#include <conio.h>
#include <windows.h>

int main()
{
               
        __int64 l,fq;
        __int64 t1=0,t2=0;
        __int64 r1=0,r2=0;

        QueryPerformanceFrequency((LARGE_INTEGER*)&fq);

        const int cnt = 250000;
        const int tests = 100;

        int stack_array[cnt]; //массив в стеке
        int *heap_array = new int[cnt]; //массив в куче (через указатели)

        for(int t=0;t<tests;++t)
        {
                // первый тест
                QueryPerformanceCounter((LARGE_INTEGER*)&t1);
                for(int i=0;i<cnt-1;++i)
                {
                        stack_array[i]=stack_array[i+1]+2;
                }
                QueryPerformanceCounter((LARGE_INTEGER*)&l);
                r1 += (l-t1);

                // второй тест
                QueryPerformanceCounter((LARGE_INTEGER*)&t2);
                for(int i=0;i<cnt-1;++i)
                {
                        heap_array[i]=heap_array[i+1]+2;
                }
                QueryPerformanceCounter((LARGE_INTEGER*)&l);
                r2 += (l-t2);
        }

        std::cout<<"stack array time = "<<(float)r1/(float)fq<<" sec."<<std::endl;
        std::cout<<"heap array time = "<<(float)r2/(float)fq<<" sec."<<std::endl;

        _getch();
        return 0;
}

на моей машине дает такие результаты:
Цитата:

0.0260
0.0272
т.е.да, на стеке массивы быстрее. совсем чуть-чуть но быстрее. но их размеры нельзя менять (более того, их размеры должны быть определены на стадии компиляции). + это значение сильно ограниченно. так, например массив в 300000 элементов уже не создается.

impersonalis 29.03.2009 15:20

Ответ: Создание динамического массива объектов класса
 
Цитата:

Сообщение от HolyDel (Сообщение 102109)
везет тебе. я тоже хочу знать выше уровня нуба.

и я! :)

Aceton 29.03.2009 16:33

Ответ: Создание динамического массива объектов класса
 
:crazy: смотря что понимать под этим уровнем

FDsagizi 29.03.2009 16:41

Ответ: Создание динамического массива объектов класса
 
std::vector.

HolyDel 29.03.2009 16:51

Ответ: Создание динамического массива объектов класса
 
мой выбор (если скорость критична) - обычный динамический массив в куче, размером в max элементов. по сути это будет обычным std::vector с reserve(max)
минусом является перерасход памяти
плюсом - скорость и простота.

Aceton 29.03.2009 19:01

Ответ: Создание динамического массива объектов класса
 
сделал через map и указатели , вот пример загрузщика карты, правда недоделанный, но рабочий

читает из файла данные и рисует обьекты

#include "../lsd.h"
#include "../blitz3dsdk.h"
#include <fstream>
#include "../player.h"
#include "../terrain.h"
#include "../building.h"
#include <map>
using namespace std;

void CLSD::LoadMap(){
map<int,CBuilding*> buildings;
char buf[128];
char *param;
int i,j=1,p=10;
int item,type,x,y,z,X,Y,Z;

ifstream map;
map.open("D:\\map.map");
if(!map.good()){bbRuntimeError("Can't open map file!");}

while(map.getline(buf,sizeof(buf)))
{

param = strtok (buf," ");
i=0;
while (param!=NULL)
{
bbText(10,p,param);
p=p+10;

switch(i)
{
case 0:
item= atoi(param);
break;
case 1:
type= atoi(param);
break;
case 2:
x=atoi(param);
break;
case 3:
y=atoi(param);
break;
case 4:
z=atoi(param);
break;
case 5:
X=atoi(param);
break;
case 6:
Y=atoi(param);
break;
case 7:
Z=atoi(param);
break;
}
param = strtok (NULL," ");
i++;
}
//в зависимости от типа обьекта находим его описание
//и вызываем нужные классы и создаем обьект

switch(type)
{
case 2:
CBuilding *b = new CBuilding ;
b->CreateBuilding("objects/buildings/box/box.3ds",type,x,y,z,X,Y,Z);
buildings[j]=b;


break;
}
j++;
}



}


Часовой пояс GMT +4, время: 01:47.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot