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

Zmiana rozmiaru tablicy w trakcie działania programu

Ostatnio zmodyfikowano 2019-01-24 22:39
Autor Wiadomość
Apurimac
Temat założony przez niniejszego użytkownika
Zmiana rozmiaru tablicy w trakcie działania programu
» 2019-01-24 19:18:43
Dzień dobry! Jestem zielony i szukam pomocy.
Piszę program wykorzystujący wiele jednowymiarowych tablic przechowujących struktury. Tablice te muszą zmieniać swój rozmiar wielokrotnie w trakcie działania programu zarówno zwiększając się jak i zmniejszając bez utraty niektórych danych.
Do zmiany ich wielkości wykorzystuję następujący algorytm:

1. Tworzę kopię (K) tablicy, której rozmiar chcę zmienić(T). (operator new)
2. Kopiuję zawartość T do K.
3. Niszczę tablicę T (operator delete)
4. Tworzę nową tablicę T' o żądanym rozmiarze 
5. Kopiuję potrzebne dane z K do T'
6. Niszczę K (operator delete).

Rozwiązanie to nastręcza mi wiele trudności. Programowanie w ten sposób jest żmudne i narażone na pomyłki.

PYTANIE: Czy istnieje prosty i wygodny sposób na usunięcie lub dodanie wiersza do tablicy w trakcie działania programu, ale bez niszczenia całej tablicy?
Z góry dziękuję za pomoc.
P-173670
pekfos
» 2019-01-24 19:34:48
1. Tworzę kopię (K) tablicy, której rozmiar chcę zmienić(T). (operator new)
2. Kopiuję zawartość T do K.
3. Niszczę tablicę T (operator delete)
4. Tworzę nową tablicę T' o żądanym rozmiarze 
5. Kopiuję potrzebne dane z K do T'
6. Niszczę K (operator delete).
Po co tworzysz kopię tablicy w tym samym rozmiarze? Twórz od razu we właściwym.

Rozwiązanie to nastręcza mi wiele trudności. Programowanie w ten sposób jest żmudne i narażone na pomyłki.
Jeśli kopiujesz kod, robisz to źle. Nie byłoby żmudne, gdybyś napisał sobie funkcję i jej używał.

Czy istnieje prosty i wygodny sposób na usunięcie lub dodanie wiersza do tablicy w trakcie działania programu, ale bez niszczenia całej tablicy?
Nie, jeśli mówimy o tablicach. Jeśli często wykonujesz wstawienia i usunięcia w środek, lepszą strukturą danych jest lista. A co do wygody, najlepsze jest gotowe rozwiązanie, np z biblioteki standardowej.
» Kurs C++ » Poziom 5Kontener std::vector<> lekcja
P-173671
Apurimac
Temat założony przez niniejszego użytkownika
» 2019-01-24 19:56:17
Faktycznie, chyba niepotrzebnie robię kopię w tym samym rozmiarze. To jest myśl! Dziękuję!

Tak napisałem sobie funkcje, ale z jedną funkcją dla wszystkich tablic jest ten problem, że zmiana rozmiaru uzależniona jest od zawartości różnych pól w strukturze dla różnych tablic. Np. z tablicy A wycinany jest wiersz x jeśli zawartość pola "abc" struktury znajdującej się w tym wierszu równa jest 0, a z tablicy B wycinane są wiersze jeśli  w tych wierszach pole struktury to "xyz". Można byłoby to wcisnąć do jednej funkcji rzeczywiście, ale musiałaby ona rozpoznawać z jakimi tablicami ma do czynienia. Może to też jest myśl...Choć już trochę mnie zaczyna przerażać;)

Przyznam, że nigdy nie uzywałem jeszcze klasy vector (chyba zapomniałem, że w ogóle istnieje) Jak teraz czytam o niej to chyba rozwiąże moje problemy. Czeka mnie tylko nauka jak operować na tych obiektach. No, ale nauka c++ to czysta przyjemność.
Zwłaszcza z tak świetną pomocą. Dzięki.


P-173672
pekfos
» 2019-01-24 20:24:40
Możesz oddzielić zmianę rozmiaru tablicy od usuwania z niej elementów. Po prostu przesuń elementy które mają zostać, by zajmowały ciągły obszar, a zmień rozmiar tablicy tylko by usunąć wolne miejsce na końcu. Są na to gotowe funkcje std::remove() i std::remove_if() w <algorithm>. Albo po prostu używaj wektora, który wszystko robi z automatu.
P-173673
Apurimac
Temat założony przez niniejszego użytkownika
» 2019-01-24 22:39:05
Zastosowałem vector do jednej z dotychczasowych tablic. Pięknie to teraz działa, a całość przestała wyglądać tak topornie jak do tej pory...
Obejrzę też te dodatkowe algorytmy.
Ukłony. 
P-173674
« 1 »
  Strona 1 z 1