Zmiana rozmiaru tablicy w trakcie działania programu
Ostatnio zmodyfikowano 2019-01-24 22:39
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.
|
|
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. Kontener std::vector<> |
|
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.
|
|
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. |
|
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. |
|
« 1 » |