Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Виды массивов


Автор: ano360 7.1.2007, 03:21
Массив 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,если первый запуск функции, тоесть в начальной точке.

Автор: ano360 8.1.2007, 11:57
vМедодом тыма выяснил, что быстрее всего работает stack

Автор: Дерзающий 8.1.2007, 15:31
Вот пример 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;
}


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)