Страницы

Поиск по вопросам

четверг, 20 декабря 2018 г.

Redim Preserve. Вопрос сложней, чем вы думаете.

Соответственно на 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 #include using namespace std;
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 int main() { vector vec; for (int i = 0; i < SIZE_CL; i++) { vec.push_back (new MyClass); vec[i]->set(); }
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; } Сравни выводы программы и проанализируй их. Я думаю, с вектором быстрее на порядок, потому что он работает с массивом указателей на объекты и это очень сильно убыстряет работу.

Комментариев нет:

Отправить комментарий