Niektórzy programiści wydają się gwałtownie ich nienawidzić, podczas gdy inni wydają się myśleć, że są w porządku. Wiem, że wszystko, co można zrobić dla tablicy wielowymiarowej, można również zrobić w regularnej tablicy, więc są funkcjonalnie równoważne. Czy używanie tablic wielowymiarowych to zła praktyka, czy nie ma to znaczenia?Czy złe jest używanie tablic wielowymiarowych w C/C++?
Odpowiedz
Czy chcesz przechowywać wielowymiarowe dane, w których znasz wymiary z wyprzedzeniem? Jeśli tak, użyj tablicy wielowymiarowej.
Jeśli nie znać wymiary wyprzedzeniem (tj będziesz musiał dynamicznie przydzielać tablicę), to albo trzeba albo
- przeznaczyć jednowymiarową tablicę i emulować tablicę używając indeksu arytmetyki n-wymiarowej lub
- przydzielić tablicę wskaźników do tablic elementów, aby uzyskać rzeczywiste wielowymiarowych semantykę tablicy
To zależy od konkretnego przypadku użycia, ale jako zasada, Prawie zawsze wolę ten pierwszy powoduje to mniej kłopotów z zarządzaniem pamięcią i mniejszą liczbą przydziałów sterty. Złożoność obu podejść rośnie wraz ze wzrostem liczby wymiarów, ale moim zdaniem rośnie ona znacznie szybciej w tym ostatnim podejściu z powodu dodatkowych poziomów pośredniego.
Emulacja n-wymiarowej tablicy z jednowymiarową może sprawić, że twój program będzie działał znacznie szybciej, jeśli przechodzisz swoje dane z wierszy po kolumnach, ponieważ sąsiadujące dane będą ładowane do pamięci podręcznej danych. Podczas gdy dynamicznie przydzielane tablice wielowymiarowe najprawdopodobniej uzyskają wyższy wskaźnik braku pamięci podręcznej, ponieważ dane są prawdopodobnie przechowywane w różnych lokalizacjach. – hdl
W jaki sposób zaimplementowałbyś mój favorite algorithm bez niego?
Cóż, w C++ nie lubię wielowymiarowych tablic, ponieważ powinny one zostać zastąpione przez std::vector<std::vector<t> >
. Są one również szczególnie ważne, jeśli chcesz reprezentować model std::vector<std::basic_string<t> >
.
Tablice wielowymiarowe są tak proste, że prymitywne, jestem zaskoczony, najbardziej by się tym przejmował. Jednak projekt, który używa jednego wymiaru, jest prawdopodobnie lepszy niż jeden z wielu wymiarów, a wszystkie inne rzeczy są równe.
Zalety wielo-dim tablic do Vector<Vector<>>
- łatwe do zapisu [] []
- C zgodne.
- Łatwo zrozumieć koncepcyjnie, co to jest.
Wady:
- Nie łatwo wykryć sprawdzanie ograniczeń. Ograniczanie końca zewnętrznych nawiasów zwykle przelewa się do pamięci przyporządkowanej przez wewnętrzne nawiasy, co powoduje, że tego typu błędy stanowią prawdziwy problem.
- Kamieniste tablice wymagają zachowania ostrożności. Wzór wektorowy jest łatwy.
- Wielowymiarowe macierze to więcej niż podwójne wskaźniki, które utrudniają prawidłowe przejście do funkcji. Przez większość czasu widziałem, jak przekazywano je jako surowy adres do podwójnego wskaźnika, który pokonuje wewnętrzną matematykę, którą kompilator zrobi dla ciebie.
Zasadniczo sprowadza się to do braku kontroli.
ponownie # 1: 'wektor
Pewnie i używam tego. Nie tak łatwe do wpisania, ani tak intuicyjne jak [1] [1]; chociaż uważam, że jest to duży powód, dla którego wektory wektorowe nie są wykorzystywane tak bardzo, jak powinny. Heck, typedef lub makro (ugh) może w razie potrzeby maskować brzydotę. –
Nigdy nie używałbym 'wektora
Możliwe jest przechowywanie danych wielowymiarowych w macierzy pojedynczych danych, ale samemu należy śledzić indeksy.Wielowymiarowe tablice są w rzeczywistości przechowywane w pamięci jako jednowymiarowa tablica, z obsługą składni reprezentującą te dane jako wielowymiarowe.
Jeśli pracujesz z wielowymiarowymi danymi, to uważam, że najlepiej jest wybrać właściwe narzędzie dla zadania (tablica wielowymiarowa).
Jeśli przyczyną jest wielowymiarowe obliczanie indeksu, to standardowa abstrakcja to std::valarray
z std::slice
.
Nie widzę niczego wielowymiarowego na ten temat. –
@Ben: dodano link do aspektu wielowymiarowego. – Potatoswatter
Mogę polecić Boost.MultiArray. Boost.MultiArray zapewnia ogólną definicję macierzy N-wymiarowej i powszechne implementacje tego interfejsu.
http://www.boost.org/doc/libs/1_42_0/libs/multi_array/doc/index.html
wiem, że coś, co można zrobić do wielowymiarowej tablicy można również należy zrobić, aby regularnym układzie
Nie sądzę, że jest całkowicie trafne. Będziemy potrzebować tablicy wskaźników do przechowywania czegoś tak podstawowego jak lista nazwisk, a następnie sortowania. Lub wskaźniki do wskaźników do przechowywania łańcucha o zmiennej długości, a następnie listę takich łańcuchów. Jako że oryginalne pytania wymieniają tylko tablice per se, nie można zobaczyć, jak można rozwiązać takie problemy z równą łatwością w regularnych tablicach. Rozważmy nie tylko przechowywanie ciągów w tablicy 1-D (używając może pewnego rodzaju separatora), ale także wykonywanie operacji takich jak sortowanie.
Istnieją następujące zalety tablic wielowymiarowych nad Vector<Vector<>>
:
- Są łatwe do zrozumienia.
- Wyszukiwanie i sortowanie elementów można wykonać bardzo łatwo.
- Są one kompatybilne z C.
- Są łatwe do wpisania.
- 1. Klonowanie tablic wielowymiarowych
- 2. Serializacja Java wielowymiarowych tablic
- 3. Stosując numpy.argmax() w wielowymiarowych tablic
- 4. C++ Indeksowanie wielowymiarowych tablic
- 5. Czy nadmierne używanie DataTable jest złe?
- 6. Szeregowanie tablic wielowymiarowych na miejscu
- 7. składnia indeksu dla tablic wielowymiarowych?
- 8. PHP: scalanie 2 wielowymiarowych tablic
- 9. Przechowywanie tablic wielowymiarowych w pandach Kolumny DataFrame
- 10. python .count dla tablic wielowymiarowych (lista list)
- 11. Czy istnieje bardziej zwięzły sposób inicjowania pustych tablic wielowymiarowych?
- 12. Scalanie dwóch wielowymiarowych tablic na konkretnym kluczem
- 13. Dlaczego wynik np.where jest tylko do odczytu dla tablic wielowymiarowych?
- 14. Dlaczego nie można wymieniać tablic wielowymiarowych?
- 15. Czy możliwa jest inicjalizacja automatycznie wielowymiarowych tablic asocjacyjnych w Ruby, tak jak w PHP?
- 16. Krojenie i rozgłaszanie wielowymiarowych tablic w Julii: meshgrid example
- 17. PHP 5.4: W jaki sposób używać składni tablic skrótu do tablic wielowymiarowych?
- 18. Czy korzystanie z automatycznego ładowania w PHP jest złe?
- 19. Czy dziedziczenie konkretnych klas jest złe?
- 20. Czy naruszenie zasady DRY jest zawsze złe?
- 21. Czy sprawdzanie poprawności JavaScript jest złe?
- 22. Czy korzystanie z toList jest złe?
- 23. Czy korzystanie z Dispatchera w moim ViewModelu jest złe?
- 24. C dziwne składni tablicy w tablicach wielowymiarowych
- 25. Czy możliwe jest rozszerzenie tablic w C#?
- 26. Dlaczego używanie wspólnego klawisza skrótu z AWS DynamoDB jest złe?
- 27. Dlaczego przypisywanie jest złe?
- 28. Mnożenie macierzy wielowymiarowych w R
- 29. Czy częste spychanie w hierarchii klasowej zawsze jest złe?
- 30. Czy złe jest umieszczanie plików właściwości/plików konfiguracyjnych w słoikach?
Zastanówcie się nad boost :: multi_array jako alternatywą. Rozwiązuje niektóre problemy tablic z mniejszą ilością napowietrznych i nieporęcznych składni w wektorach zagnieżdżonych. – frankc