dodawanie elementów do tablicy dynamicznej.
Ostatnio zmodyfikowano 2017-04-24 03:21
bojo240 Temat założony przez niniejszego użytkownika |
dodawanie elementów do tablicy dynamicznej. » 2017-04-24 00:55:47 Witam, problem zgoła banalny, a już od tygodnia nie jestem w stanie znaleźć na niego rozwiązania. Wiem, że zagadnienie typu 'wymyśl koło na nowo', jednak takie zadanie otrzymałem od prowadzącego na studiach. Wrzucam wszystko w jednym pliku, gdyż to co ważne mieści się w 50 linijkach. Jedna metoda dodająca x razy y elementow do tablicy na wybrany indeks, jedna usuwająca tablicę/zwalniająca pamięć i otoczka służąca pomiarom czasu. Wszystko działa, gdy chcę dodać jeden raz 100 000 elementów. Wszystko działa, gdy chcę dodać dwa razy 1 000 elementów. Gdy jednak chcę np dodać 5 000 razy 5 000 elementów - wysypuje przeróżne błedy - nigdy bad alloc - co najśmieszniejsze praktycznie od razu po odpaleniu programu, gdzie dodanie 100 000 elementów trwa 15-16 sekund (na moim procesorze). Będę wdzięczny za wszelką pomoc (wiem, że tego typu implementacji jest od groma w sieci, ale chciałbym zrozumieć w czym jest tu problem). #include <iostream> #include <numeric> #include <chrono> #include <cstdlib>
class Table { int * tab; int cnt; public: Table(); void clearTable(); void test_addValueToTable( int index, int value ); };
Table::Table() : tab( nullptr ) , cnt( 0 ) {; }
void Table::clearTable() { if( cnt == 0 ) return; delete tab; cnt = 0; }
void Table::test_addValueToTable( int index, int value ) { int * NewTab = new int[ cnt + 1 ]; for( int i = 0; i < index; ++i ) NewTab[ i ] = tab[ i ]; NewTab[ index ] = value; for( int i = index + 1; i < cnt + 1; ++i ) NewTab[ i ] = tab[ i - 1 ]; delete[] tab; tab = NewTab; ++cnt; }
Table myTab;
int main() { int el, razy; std::cout << "Ile elementow dodac do tablicy?"; std::cin >> el; std::cout << "Ile razy dodac elementy do tablicy?"; std::cin >> razy; auto start = std::chrono::high_resolution_clock::now(); for( int j = 0; j < razy; ++j ) { for( int i = 0; i < el; ++i ) myTab.test_addValueToTable( 0, rand() % 1000 ); myTab.clearTable(); } auto stop = std::chrono::high_resolution_clock::now(); std::chrono::duration < double > czas = stop - start; std::cout << "Sredni czas dodawania elementow do tablicy:" << czas.count() / razy << "\n"; }
|
|
Lora |
» 2017-04-24 01:31:59 Kasujesz tablicę w clearTable, a później znowu w metodzie dodającej element. void Table::clearTable() { if( cnt == 0 ) return; delete[] tab; tab = nullptr; cnt = 0; }
|
|
bojo240 Temat założony przez niniejszego użytkownika |
» 2017-04-24 03:21:56 Dziękuje ślicznie, zrozumiałem gdzie leży pies pogrzebany. Kod pisałem dość dawno, kiedy wskaźniki były dla mnie mniej zrozumiałe, niż są dzisiaj, dlatego nie mogłem tego znaleźć. Dzięki wielkie raz jeszcze :) |
|
« 1 » |