Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виды массивов, какие быстрее всего работают 
:(
    Опции темы
ano360
  Дата 7.1.2007, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Массив vector работает доволно мелдленно если постоянно измнять его размер, каки массивы работают быстрее. 
коментарии после кода.

Код

bool TRPoint::FindWay(vector<TRCords> &vectorF,vector<TRCords> *vectorLoc,vector < vector < TRPoint> > &Pts,int &N,TRPointColor PC,TRCords i1j1,bool start=false){
if (temp==0){//Если эту точку ещё не сканировали
        temp=1;
        //Еслиточка пустая, в любом случае лобовляем во временный лист
         if (PointColor==Free) vectorLoc->push_back(ijcords);
         //Если это наша точка, обработать
        if (PointColor==PC){
                //если это не первый вызов и мы попали в начало значит был сделан круг
                if (!(start)&&(i1j1==ijcords))
                //проверка, естьли в окруженнном нами поле вражеские точки - пока отключена
               /* if (IsVectorAroundAnamy(vectorLoc,PC)){
                //сравниваем листы
                        if (N==int(vectorLoc.size())){vectorF=vectorSumm(vectorF,vectorLoc);}
                        if (N>int(vectorLoc.size())){vectorF.clear();vectorF=vectorLoc; N=vectorLoc.size();}
                }  */ ;
        }
        //обыскиваем всё вокруг
        if (PointColor==Free || PointColor==PC){
                int x1,x2,y1,y2;
                int i1=ijcords.i;
                int j1=ijcords.j;

                if (i1==0)          x1=i1; else x1=i1-1;
                if (i1==mnsize.i-1) x2=i1; else x2=i1+1;
                if (j1==0)          y1=j1; else y1=j1-1;
                if (j1==mnsize.j-1) y2=j1; else y2=j1+1;

         
                for (int i=x1;i<=x2;i++)
                for (int j=y1;j<=y2;j++)
                if(! Pts[i][j].FindWay(vectorF,vectorLoc,Pts,N,PC,i1j1))
                //если след строчку отключить работает быстро, нет-медленно
                //vectorLoc->pop_back();
        }
        //длинну считаем только по пустым клеткам. если у нас пустая, возвращаем "наверх" true
        if (PointColor==Free)
                return true;
        
}
return false;
}



Такая вот запаарочка. Есть двумерный массив произвольного размера, организован через vector.
Есть функция, выполняющая поиск кратчайшего пути от одной точки до ней самойже в обход разных препятствий, тобишь определённых клеток массива.
Массив: vector < vector < TRPoint> > Pts-(расшифровывается"Points")
TRPoint-класс, в котором всё о данной клетке.

функция с оригинальным названием FindWay - член класса  TRPoint.
вызываетсявот так

Pts[i][j].FindWay(vector<TRCords> &vectorF,vector<TRCords> *vectorLoc,vector < vector < TRPoint> > &Pts,int &N,TRPointColor PC,TRCords i1j1,bool start=false)

Вкратце о параметрах:
vectorF-Сюда в итоге записываются все кординаты кратчайшего пути
vectorLoc-сюда записываютс временные кординаты пути и потом сравниваются с vectorF.
Pts-сам массив
N-сюда в итоге записывается длинна кратчайшего пути.
PC-цвет клетки. enum TRPointColor{Red,Blue,Free}; Free-свободная клетка Red-Можно ходить Blue- препятствие
i1j1-кординаты начала 
start-true,если первый запуск функции, тоесть в начальной точке.


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
ano360
Дата 8.1.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



vМедодом тыма выяснил, что быстрее всего работает stack


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
Дерзающий
Дата 8.1.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Вот пример 3d матриц сам писал, работает, проверял. Аналогично для 2 и 1 мерных матриц. Сделай минимальным интерфейс и будет всё максимально быстро.
Код

class Matrix3D {
    int* data;
    int X;
        int Y;
        int Z;
public:
        Matrix3D();
        void Resize(int rsizeX, int rsizeY, int rsizeZ);
    Matrix3D(int sizeX, int sizeY, int sizeZ);
        ~Matrix3D(){delete[ ] data;}
        int GetItems(int x,int y,int z);
        void SetItems(int x,int y,int z, int value);
        int SizeX(){return X;}
        int SizeY(){return Y;}
        int SizeZ(){return Z;}
};

Matrix3D::Matrix3D()
{
data=new int [2];
data[0]=0;
data[1]=0;
X=1;
Y=1;
Z=1;
}

void Matrix3D::Resize(int rsizeX, int rsizeY, int rsizeZ)
{
delete[ ] data;
data=new int [rsizeX*rsizeY*rsizeZ];
for(int i=0;i<rsizeX*rsizeY*rsizeZ;i++)
{
data[i]=0;
}
X=rsizeX;
Y=rsizeY;
Z=rsizeZ;
}

Matrix3D::Matrix3D(int sizeX, int sizeY, int sizeZ)
{
data=new int [sizeX*sizeY*sizeZ];
for(int i=0;i<sizeX*sizeY*sizeZ;i++)
{
data[i]=0;
}
X=sizeX;
Y=sizeY;
Z=sizeZ;
}

int Matrix3D::GetItems(int x,int y,int z)
{
return data[X*Y*z+y*X +x];
}

void Matrix3D::SetItems(int x,int y,int z, int value)
{
data[X*Y*z+y*X +x]=value;
}


PM MAIL   Вверх
stmamont
Дата 11.1.2007, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



ano360, stack - хорош только когда производишь операции типа pop , push.  стэк - filo
если нужен fifo то это queue, если же нужно выкидывать произволбные элементы наиболее быстро то это list
если нужно только добавлять в конец - то это vector


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.