Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

dodawanie elementów do tablicy dynamicznej.

Ostatnio zmodyfikowano 2017-04-24 03:21
Autor Wiadomość
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).


C/C++
#include <iostream>
#include <numeric>
#include <chrono>
#include <cstdlib>

class Table
{
    int * tab; //tablica dynamiczna
    int cnt; //ilosc elementow w tablicy
public:
    Table();
    void clearTable();
    void test_addValueToTable( int index, int value );
};

Table::Table()
    : tab( nullptr )
     , cnt( 0 )
{; } //lista inicjalizacyjna

void Table::clearTable()
{
    if( cnt == 0 ) //jezeli ilosc elementow =0, wyjdz z metody
         return;
   
    delete tab; //zwolnij pamiec
    cnt = 0; //
}

void Table::test_addValueToTable( int index, int value )
{
    int * NewTab = new int[ cnt + 1 ]; //nowa tablica
    for( int i = 0; i < index; ++i ) // kopiuje wartosci przed indexem
         NewTab[ i ] = tab[ i ];
   
    NewTab[ index ] = value; //na index wstawiam zadana wartosc
    for( int i = index + 1; i < cnt + 1; ++i ) // i kopiuje reszte
         NewTab[ i ] = tab[ i - 1 ];
   
    delete[] tab; //zwalniam pamiec zajmowana przez poprzednia tablice
    tab = NewTab; // przypisuje wskaznik na nowa tablice.
    ++cnt; // zwiekszam licznik
}

Table myTab; //utworzenie obiektu

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(); //poczatek odliczania
    for( int j = 0; j < razy; ++j )
    {
        for( int i = 0; i < el; ++i )
             myTab.test_addValueToTable( 0, rand() % 1000 ); //dodaj na poczatek tablicy losowa wartosc z przedzialu <0-999>
       
        myTab.clearTable(); //zwolnij pamiec po kazdym dodaniu elementow do tablicy
    }
    auto stop = std::chrono::high_resolution_clock::now(); //koniec odliczania
    std::chrono::duration < double > czas = stop - start; //odejmij czasy
    std::cout << "Sredni czas dodawania elementow do tablicy:" << czas.count() / razy << "\n"; //wyswietl w sekundach
}
P-160456
Lora
» 2017-04-24 01:31:59
Kasujesz tablicę w clearTable, a później znowu w metodzie dodającej element.
C/C++
void Table::clearTable()
{
    if( cnt == 0 )
         return;
   
    delete[] tab; //tutaj tez powinny byc nawiasy kwadratowe
    tab = nullptr; //delete użyte na nullptr nie bedzie powodowac bledu
    cnt = 0; //
}

P-160457
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 :)
P-160458
« 1 »
  Strona 1 z 1