Соответственно на C++ имеем класс: Class MyClass{ public: double *ptr; void Set(); }; MyClass::Set(){ ptr=new double[10000000]; } Далее в основном коде: MyClass *A; A=new MyClass[10000]; Затем требуется изменить размерность массива A с сохранением его элементов, вопрос в том как это сделать максимально производительно !?
Ответ
Способ в лоб: создать новый массив, скопировать туда элементы старого массива, уничтожить старый массив.
Правильный способ: использовать STL.
P.S. В таком классе, где происходит динамическое выделение памяти, нужно позаботиться об уничтожении ее в деструкторе и о копировании ее в копирующем конструкторе и в операторе присвоения. Иначе дело может очень плохо закончиться (((
PPS. Вот тут на досуге накропал нечто. Приятного аппетита.
#include
enum {SIZE = 10000, SIZE_CL = 5};
class MyClass {
private:
double* ptr;
void array_cpy (MyClass& mc) {
if (!flag) {
cout << "Copying array" << endl;
ptr = new double [SIZE];
memcpy (ptr, mc.ptr, SIZE*sizeof(double));
}
else {
cout << "Copying ptr" << endl;
ptr = mc.ptr;
mc.ptr = 0;
}
}
public:
static bool flag ;
static int count;
void set() {
cout << "Creating array" << endl;
ptr = new double [SIZE];
for (int i = 0; i< SIZE; i++) {
ptr[i] = count;
}
count++;
}
double get(int index) {
return ptr [index];
}
MyClass (): ptr(0) {}
MyClass (MyClass& mc) {
array_cpy(mc);
}
MyClass& operator= (MyClass& mc) {
array_cpy(mc);
return *this;
}
~MyClass () {
if (!flag && ptr) {
cout << "Deleting array" << endl;
delete[] ptr;
}
}
};
bool MyClass:: flag = false;
int MyClass:: count = 0;
int main() {
MyClass* aa = new MyClass [SIZE_CL];
for (int i = 0; i < SIZE_CL; i++) aa[i].set();
MyClass::flag = true;
MyClass* bb = new MyClass [SIZE_CL*2] ;
for (int i = 0; i< SIZE_CL; i++) {
bb[i] = aa[i];
}
MyClass::flag = false;
cout << bb[3].get(400) << endl;
delete[] bb;
}
А теперь с vector'ом:
#include
cout << vec[3]->get(400) << endl;
for (int i = SIZE_CL; i < SIZE_CL*2; i++) {
vec.push_back (new MyClass);
vec[i]->set();
}
cout << vec[3]->get(400) << endl;
}
Сравни выводы программы и проанализируй их. Я думаю, с вектором быстрее на порядок, потому что он работает с массивом указателей на объекты и это очень сильно убыстряет работу.
Комментариев нет:
Отправить комментарий