Unterschied std::vector<int> und int*
-
int **ptr ist ein Zeiger auf einen Zeiger zeigt der auf einen int zeigt
Du meinst das aber bestimmt im Zusammenhang mit mehrdimensionalen Arrays.Ein std::vector dagegen ist eine Kapselung eines Arrays, du kannst auf das Array nur über bestimmte, im vector definierten Methoden zugreifen. std::vector gaukelt einem die Eigenschaften eines dynamischen (in der größe änderbaren) Arrays vor.
std::vector< std::vector<int> > ist ein vector der vectoren von int enthält, also prinzipiell ein dynamisches zweidimensionales Array.//Edit: habe die Fehler entfernt um den TO nicht zu verwirren.
-
SeppJ schrieb:
int** und vector<vector<int>> modellieren beide das gleiche Konzept...
Ich weiß zwar, was Du im Kontext meinst, aber die Aussage ist in sofern gewagt, als dass der TO anscheinend noch gundlegende Verständnisprobleme bei Pointern hat.
-
RedPuma schrieb:
[...]Hier wäre int asd[4][4]; die deklaration für ein 4x4 array. Hierbei ist asd vom Typ int**, asd[2] ist vom Typ int* und asd[2][2] vom Typ int.
Leider nicht.
Bei einemint asd[4][4]ist asd vom Typint[4][4]und nicht vom Typint**. Das ist nicht einmal konverierbar. Und der Typ vonasd[0]ist einint[4]und keinint*.
-
Tachyon schrieb:
SeppJ schrieb:
int** und vector<vector<int>> modellieren beide das gleiche Konzept...
Ich weiß zwar, was Du im Kontext meinst, aber die Aussage ist in sofern gewagt, als dass der TO anscheinend noch gundlegende Verständnisprobleme bei Pointern hat.
Ich meine das, was man damit macht, ist in der Regel das gleiche, nämlich eine dynamische Liste von dynamischen Listen verwalten. Außer eventuell die exotische Anwendung, dass ein int** eventuell auch ein C-Style-Call-by-reference eines int* sein könnte, was bei einem vector<vector> klar ausgeschlossen ist.
-
SeppJ schrieb:
int** und vector<vector<int>> modellieren beide das gleiche Konzept, eine Art Liste von Listen (das ist kein 2D-Array!). Der Unterschied ist, dass die vector-Variante dir weitgehend entgegenkommt, so dass man kaum noch etwas falsch machen kann, bei der int**-Variante muss man auf ungeheuer viel aufpassen, hat aber keinerlei nennenswerte Vorteile. Eigentlich ist die einzig vernünftige Methode mit int** sauber umzugehen, dies in einer Klasse zu wrappen. Und dann hätte man vector.
Bei vector ist der Unterschied dass der Speicherplatz für die eigentlichen Daten immer auf dem Heap erstellt wird. Die Menge an reserviertem Speicher bestimmt vector größtenteils selbst, außer man sagt ihm explizit über den Constructor etwas anderes.
Wenn ich z.B. eine Matrix-Klasse schreiben würde, würde ich immer float val[4][4]; oder float val[44];* als Member benutzen und nie einen vector, ansonsten würde sobald ich eine Matrix auf dem Stack erstelle der Heap beansprucht, was zu extremen Leistungseinbrüchen führen kann. Kommt halt immer auf den Verwendungszweck an.
-
Tachyon schrieb:
RedPuma schrieb:
[...]Hier wäre int asd[4][4]; die deklaration für ein 4x4 array. Hierbei ist asd vom Typ int**, asd[2] ist vom Typ int* und asd[2][2] vom Typ int.
Leider nicht.
Bei einemint asd[4][4]ist asd vom Typint[4][4]und nicht vom Typint**. Und der Typ vonasd[0]ist einint[4]und keinint*.//EDIT:
Du hattest tatsächlich recht, entschuldige.
-
RedPuma schrieb:
Haarspalterei. Theoretisch ja. In der Praxis gibts da aber keinen Unterschied außer man betrachtet Funktionsparameter, wobei die Zeigertypen als Parameter immer funktionieren.
Der Unterschied ist gigantisch und das Ignorieren das Unterschieds immer wieder eine Quelle für tolle Fehler.
-
@RedPuma: was hat das mit dem Thema zu tun? Ja, vector<vector> will man fast nie, genausowenig wie int**. Aber dein Vorschlag ist keine Alternative, denn er kann nicht das gleiche leisten.
Das int** kein Zeiger auf ein Array ist, ist keine Haarspalterei, sondern ein ganz entscheidender Unterschied, den man, wenn man mit Arrays rumspielt, unbedingt wissen muss. Das ist an dir anscheinend vorbeigegangen und jetzt willst du es auch noch an empfängliche Anfänger weitergeben.
-
Okay danke ihr beiden, ich habs mir grad nochmal überlegt und ihr habt natürlich recht, Entschuldigung an den TO.
-
Huch

Einiges konnte mir schon eine kleine Einleuchtung bringen.
Klar, es liegt an den Pointer-Verständigungsproblem...
Das will mir nicht in den Kopf; zumindest im Zusammenhang mit den Arrays. Es wird zwar langsam klarer, da es in dem mir vorliegenden Code nur so wimmelt von Pointern, aber ganz durchblicken tue ich nicht.Ich muss dazu sagen, ich bin keine Programmiererin und habe mehr schlecht als recht Erfahrung mit c++. Aber wenn die Arbeit was verlangt, dann muss das eben in hinreichend schneller Zeit geschehen...
Der Originalverfasser des Quellcodes ist net da... was will man da machen xDTrotzdem Danke für eure Mühen. Ich wussel mich da mal durch und gucke
