Die Frage ist wirklich ziemlich selbsterklärend. Ich weiß vage über Vektoren in der Mathematik Bescheid, aber ich sehe den Link zu C ++ - Vektoren nicht wirklich.
Die Frage ist wirklich ziemlich selbsterklärend. Ich weiß vage über Vektoren in der Mathematik Bescheid, aber ich sehe den Link zu C ++ - Vektoren nicht wirklich.
Antworten:
Die mathematische Definition eines Vektors ist ein Mitglied der Menge S
n
, bei der es sich um eine geordnete Folge von Werten in einer bestimmten Menge handelt ( S
). Dies ist, was ein C ++ vector
speichert.
std::vector
nicht liefert, 3. Das Argument , dass std::vector
eine geordnete Folge von Werten könnte gelten std::list
, std::deque
, std::basic_string
etc.
Es wird als Vektor bezeichnet, da Alex Stepanov, der Designer der Standardvorlagenbibliothek, nach einem Namen suchte, um ihn von integrierten Arrays zu unterscheiden. Er gibt jetzt zu, dass er einen Fehler gemacht hat, weil die Mathematik den Begriff "Vektor" bereits für eine Folge von Zahlen fester Länge verwendet. C ++ 11 verstärkt diesen Fehler, indem es ein Klassenarray einführt, das sich ähnlich wie ein mathematischer Vektor verhält.
Alex 'Lektion: Sei jedes Mal sehr vorsichtig, wenn du etwas nennst.
Ein Auszug aus der Programmiersprache C ++ von Bjarne Stroustrup:
"Man könnte argumentieren, dass Valarray als Vektor bezeichnet werden sollte, weil es ein traditioneller mathematischer Vektor ist, und dass Vektor als Array bezeichnet werden sollte . Dies ist jedoch nicht die Art und Weise, wie sich die Terminologie entwickelt hat."
Nur um zu sagen, warum es wahrscheinlich nicht heißt array
: Weil std::vector
es eine dynamische Größe hat. Ein Array ist konzeptionell in der Länge festgelegt. Next C ++ Standard hat übrigens eine std::array
Vorlage, deren Größe festgelegt ist und die einem einfachen Array vorgezogen werden sollte:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
wäre es nicht gut , die anpassbare Klasse zu benennen .
Um die hervorragende Resonanz von @MarkRuzon zu ergänzen:
Alex sagte, um dem heutigen std :: vector einen Namen zu geben, habe er den Namen beobachtet, den Scheme und Common Lisp ähnlichen Datenstrukturen gegeben hatten.
Später gibt er zu, dass er sich geirrt hat, weil der C ++ - Vektor nichts mit den Vektoren in der Mathematik zu tun hat.
Er sagt auch, dass er einen Fehler einer Gemeinschaft von 50 Menschen in eine Gemeinschaft von 5 Millionen Menschen eingeführt hat, so dass der Fehler wahrscheinlich für immer bestehen bleibt.
Es ist nur der Name. Der C ++ - Vektor könnte sehr gut (oder sogar noch genauer) als dynamisches Array oder skalierbares Array bezeichnet werden, aber dieser Name wurde einfach gewählt . Dieser Vektor ist nicht derselbe wie der Vektor aus der Methematik, da in der Mathematik Vektoren Mitglieder einer Menge V sind, so dass für diese Menge zwei wichtige Operationen definiert sind: + (Addition von Vektoren) und x (Multiplikation eines Vektors mit einem Skalar aus dem Feld F ) und diese Operationen erfüllen 8 Axiome :
Assoziativität der Addition
u + (v + w) = (u + v) + w
Kommutativität der Addition
u + v = v + u
Identitätselement der Addition
Es gibt ein Element 0 ∈ V , das als Nullvektor bezeichnet wird , so dass v + 0 = v für alle v ∈ V ist .
Inverse Elemente der Addition
Für jedes v ∈ V existiert ein Element −v ∈ V , das als additive Inverse von v bezeichnet wird, so dass v + (−v) = 0 ist
Kompatibilität der Skalarmultiplikation mit der Feldmultiplikation
a (bv) = (ab) v
Identitätselement der Skalarmultiplikation
1 v = v, wobei 1 die multiplikative Identität in F bezeichnet .
Verteilbarkeit der Skalarmultiplikation in Bezug auf die Vektoraddition
a (u + v) = au + av
Verteilbarkeit der Skalarmultiplikation in Bezug auf die Feldaddition
(a + b) v = av + bv
C ++ std::vector
unterstützt alle von ihnen (nicht direkt, sondern über C ++ - Funktionen), so dass es irgendwie als Vektor bezeichnet werden kann, aber es ist nur Umgangssprache und wird beispielsweise Vallaray
von Bjarne Stroustrup in "C ++ Programming Language" direkt unterstützt.
std::vector
keine arithmetischen Operationen, und daher sind alle diese Eigenschaften für a undefiniert std::vector
. A std::vector
qualifiziert sich also nicht als Vektor. Ich hätte es genannt dynamic_array
oder resizable_array
was sagt dir was es ist.
Ein Vektor ist einfach eine Folge von Werten vom gleichen Typ. Dies entspricht weitgehend der Verwendung in der Mathematik. Ich denke, die mathematische Idee, dass Vektoren einige gängige Operationen unterstützen sollten (wie das Hinzufügen und Skalieren durch einen Skalar), wird nicht übernommen, der wichtige Aspekt ist hauptsächlich die Struktur.
Auch wenn Sie dafür sorgen, dass Ganzzahlen oder Gleitkommazahlen gespeichert werden, eignet es sich hervorragend zum Speichern von N-dimensionalen Vektoren. Immerhin ist ein Vektor eine Liste von Zahlen, die in einer bestimmten Reihenfolge gehalten werden.
0.1
, während dieser Wert in der Mathematik ein Mitglied der Menge reeller Zahlen ist. In der Java-Programmiersprache ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) lautet ein Vektor "Die Vector-Klasse implementiert ein erweiterbares Array von Objekten. Wie ein Array enthält sie Komponenten, die Der Zugriff kann über einen ganzzahligen Index erfolgen. Die Größe eines Vektors kann jedoch nach Bedarf vergrößert oder verkleinert werden, um das Hinzufügen und Entfernen von Elementen nach dem Erstellen des Vektors zu ermöglichen. "
Vor langer Zeit gab es in der Sprache B Vektortypen. Dann nannte die C-Sprache sie "Arrays". Dann hat das C mit Klassen und die C ++ - Sprache es einfach abgeleitet ...
Dies ist sicherlich nicht die ganze Geschichte. Wie oben erwähnt, traf Stepanov die eigentliche Entscheidung. Aber wenn "Vektor" noch in C verwendet wurde, sieht das Ergebnis vielleicht ganz anders aus.
PS. Ich frage mich, warum C "Array" umbenennt. Was war der genaue Grund?
PS2. IMO für eine Sprache wie C ++ bedeutet ein Array besser "ein Typ, der Elemente enthält, auf die über den Operator [] angemessen zugegriffen werden kann" (dh nicht 42 [some_array_object]), z. B. eine Instanziierung von std :: map als "assoziatives Array".
Ich würde vermuten, dass es vom Begriff Zeilenvektor kommt . Auch Informatiker lieben es, sich neue Namen für Dinge auszudenken ...
Aber mathematische Vektoren sind nicht dynamisch. Ich habe noch nie einen Wechsel von 2D zu 3D oder etwas anderem gesehen, wenn herkömmliche Arrays zu besseren Vektoren führen.
Keine Ahnung über den wahren Grund, aber C ++ nennt es einen Vektor anstelle eines Arrays, reduziert die Verwirrung zwischen den C- und C ++ - Strukturen, obwohl sie die gleichen Rollen erfüllen.
Stellen Sie sich einen C ++ - Vektor als dynamisches Array vor, dessen Größe durch Einfügen oder Entfernen von Elementen geändert werden kann. Sie hängen nicht mit der mathematischen Definition des Vektors zusammen.
Vektoren in der Mathematik
Stellen Sie sich eine nxm
aufgerufene Matrix vor A
, n
die der Anzahl der Zeilen und m
der Anzahl der Spalten entspricht. In einem mathematischen Kontext können Sie, sobald Sie eine Matrix wie diese einführen, später keine Operationen außerhalb des A
Bereichs ausführen und auch die A
Größe nicht erweitern . Dies bedeutet, dass Sie nicht auf einen Index von [n + 1]
und / oder verweisen können [m + 1]
.
Nun A
leitet ein Vektor von auch diese Attribute ab, während ihre Dimensionen immer 1xm
(jede darin [i]
ausgewählte Zeile A
) oder nx1
(jede darin [j]
ausgewählte Spalte A
) sind. Ein Vektor kann auch nicht als angegeben werden 2xn
, da eine Sammlung von Vektoren nicht als ein Vektor interpretiert werden kann , während ein Vektor - sei dies der [i]
Spaltenvektor A
mit den Dimensionen von 1xm
- als Matrix interpretiert werden kann.
Der wichtige Aspekt ist, dass Sie die Dimensionen eines Vektors nach seiner Einführung in die Mathematik nicht mehr ändern können.
Vektoren in C ++
In C ++ sind Vektoren genau wie Vektoren in der Mathematik, aber im Gegensatz zur Mathematik kann ihre Größe geändert werden . Größe als Begriff gilt hier, weil er die Elementanzahl impliziert, die ein bestimmter Vektor enthält.
Sie verwenden den Begriff Dimensionen in Bezug auf C ++ - Vektoren, wenn Sie einen Vektor von Vektoren haben : std::vector<std::vector<T>>> ragged_array
. In diesem Beispiel habe ich diesen Vektor "zerlumpt" genannt, weil er zeigt, wie die Größe jedes Vektors dieses Vektors unabhängig geändert werden kann. Es verstößt nicht nur gegen die Regeln, wie die Dimensionen nicht geändert werden können, sobald ein bestimmter Vektor in die Mathematik eingeführt wurde, sondern zeigt auch, wie er nicht als Matrix verwendet werden kann.
Wundert sich, dass die Parametrisierung von Typen mit Namen zu tun hat.
Hier wird eine Spalte gesprengt. (Quelltext für einige serverseitige ASP.NET-HTML-Codierungsfähigkeiten anzeigen.)
oder war es eine Reihe?
Andererseits klingt der Name immer noch verdammt gut, wenn man es im Kontext von MIMD oder sogar SSE-Vektormaschinen betrachtet.