2010-04-21 20 views
18

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++?

+0

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

Odpowiedz

12

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.

+0

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

0

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.

4

Zalety wielo-dim tablic do Vector<Vector<>>

  1. łatwe do zapisu [] []
  2. C zgodne.
  3. Łatwo zrozumieć koncepcyjnie, co to jest.

Wady:

  1. 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.
  2. Kamieniste tablice wymagają zachowania ostrożności. Wzór wektorowy jest łatwy.
  3. 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.

+2

ponownie # 1: 'wektor > a (1, wektor (1)); a [0] [0] = ... 'jest OK. – Potatoswatter

+0

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ę. –

+2

Nigdy nie używałbym 'wektora >', chyba że mój przypadek użycia był postrzępiony. –

0

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).

0

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.

+0

Tablica wskaźników jest nadal tablicą 1-D. – Maulrus

+0

Wyrażenie indeksu tablicowego jest równoważne wyrażeniu zapisanemu jako wskaźnik i przesunięcie. cf. Kernighan & Ritchie p99. – AruniRC

1

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.
Powiązane problemy