Warum wird ein C ++ - Vektor als Vektor bezeichnet?


147

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.


5
Vektoren (Magnitute + Richtung) in der Physik sind das erste, was mir in den Sinn kommt, sobald ich das Wort Vektoren höre.
RBT

Antworten:


109

Die mathematische Definition eines Vektors ist ein Mitglied der Menge Sn, bei der es sich um eine geordnete Folge von Werten in einer bestimmten Menge handelt ( S). Dies ist, was ein C ++ vectorspeichert.


21
Vektoren werden aufgrund ihrer Verwendung in der Physik typischerweise nur als 2-3-dimensional betrachtet. Aber allgemeiner in der Mathematik bedeuten sie nur eine Menge von Zahlen, die eine Reihenfolge haben (mathematische Mengen sind ordentlich, sie sind wie eine Tasche voller Dinge). Ein Vektor kann eine beliebige Anzahl von Elementen haben.
Joseph Garvin

8
vartec, kann ein euklidischer Vektor nicht als Koordinatenvektor dargestellt werden und umgekehrt? Sie sind nur verschiedene Darstellungen derselben Sache (eines Tupels) im euklidischen Raum im Vergleich zum allgemeineren Vektorraum.
Calvin

6
@ Joseph Garvin: Vektoren müssen nicht einmal Komponenten haben, die Zahlen sind. Beispielsweise können bestimmte Funktionssätze verwendet werden, um Vektorräume zu bilden, in denen die Komponenten Funktionen sind.
Jason

13
Ein Vektor ist buchstäblich ein "Träger". Das gleiche Wort wird für (z. B.) Insekten verwendet, die Krankheiten übertragen, und stammt aus derselben lateinischen Wurzel wie "Vehikel". Es ist also etwas, das Sie von einem Ort zum anderen bringt. Das Wort "Matrix" stammt übrigens auch aus dem Lateinischen und bedeutet "Mutterleib".
Artelius

6
Dies scheint nicht zufriedenstellend , weil: 1. Mathematische Vektoren nicht in der Dimension ändern, 2. Mathematische Vektoren Operationen, die std::vectornicht liefert, 3. Das Argument , dass std::vectoreine geordnete Folge von Werten könnte gelten std::list, std::deque, std::basic_stringetc.
jamesdlin

188

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.


1
Das Array verwendet jedoch auch keine Heap-Zuordnung, wodurch das Verschieben weniger effizient wird. Wir haben auch std :: valarray, übrigens.
Sellibitze

1
Sie können es auf dem Haufen zuordnen, wenn ein billiger Umzug erwünscht ist.

2
Schön zu wissen, dass sie diese Lektion gelernt haben, obwohl es zu spät ist. Obwohl ... typedef oder #define es auch beheben können.
LearnCocos2D

4
Es gibt nur zwei schwierige Dinge in der Informatik: Cache-Ungültigmachung und Benennung - Phil Karlton
RBT

7
Wenn Sie in Ihrer Antwort behaupten wollen, "[Alex Stepanov] gibt jetzt zu, dass er einen Fehler gemacht hat", geben Sie bitte ein Zitat an.
Trevor Boyd Smith

56

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


51
Pfftt .. was weiß der Typ. Ich habe noch nie von dieser "Bjarne Stroustrup" Person gehört.
Calvin

5
Ich frage mich nur, wie viele der positiven Stimmen des vorherigen Kommentars tatsächlich auf einen Unterlauf zurückzuführen sind ...
rindeal

16

Der Name stammt aus der linearen Algebra, wobei der Vektor eine Matrix mit nur einer Spalte oder nur einer Zeile ist.


10

Nur um zu sagen, warum es wahrscheinlich nicht heißt array: Weil std::vectores eine dynamische Größe hat. Ein Array ist konzeptionell in der Länge festgelegt. Next C ++ Standard hat übrigens eine std::arrayVorlage, deren Größe festgelegt ist und die einem einfachen Array vorgezogen werden sollte:

std::array<int, 4> f = { 1, 2, 3, 4 };

Wurde dieser neue C ++ - Standard bereits veröffentlicht?
Johannes Jensen

1
Dies ist keine gute Antwort, da ein Vektor auch eine feste Größe hat. Vektoren sind reine Werte, sie sind Elemente in einer Menge, die zusammen mit einer zusätzlichen Struktur einen abstrakten Vektorraum bilden. Der Begriff "Ändern der Größe" eines Vektors ist völliger Unsinn.
Sara

@ Kai Ich denke, es gibt eine Verwirrung hier. Ich habe lediglich argumentiert dafür , warum es wird nicht genannt Array . Ich habe nicht versucht zu erklären, warum es speziell Vektor genannt wird . Ein Array in C ++ hatte schon vor der Standardisierung der Sprache immer eine feste Größe, daher std::arraywäre es nicht gut , die anpassbare Klasse zu benennen .
Johannes Schaub - litb

Jetzt können Sie sich zu Recht beschweren, dass dies keine große Antwort, sondern ein gültiger Kommentar ist. Insofern stimme ich dem ersten halben Satz (bis zum Komma) Ihres Kommentars zu. Jetzt ist es jedoch zu spät, meine Antwort in einen Kommentar zu der Frage zu verschieben, da diese nützlichen Kommentare von Ihnen und @ user12 verloren gehen würden.
Johannes Schaub - litb

Als Kompromiss zur Lösung des Dilemmas habe ich das Antwort-Community-Wiki erstellt. Dadurch werden alle Upvote-Punkte und Downvote-Verluste, die ich von meinem Konto erhalten habe, entfernt. Wenn sich noch jemand bei mir für meinen genialen Verkleidungskommentar bedanken möchte, kann er diesen gegenständlichen Kommentar positiv bewerten.
Johannes Schaub - litb

10

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.


5

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::vectorunterstü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 Vallarayvon Bjarne Stroustrup in "C ++ Programming Language" direkt unterstützt.


3
In keinem Container in C ++ ist diese Art von Arithmetik definiert, sodass in C ++ keine Vektoren vorhanden sind. Insbesondere unterstützt a std::vectorkeine arithmetischen Operationen, und daher sind alle diese Eigenschaften für a undefiniert std::vector. A std::vectorqualifiziert sich also nicht als Vektor. Ich hätte es genannt dynamic_arrayoder resizable_arraywas sagt dir was es ist.
user877329

4
Oder einfach "Liste". Aber noooooo ... es musste "Vektor" sein, denn das ist es, was jeder benutzt, oder?
LearnCocos2D

1
@ LearnCocos2D Nun, eine Liste wird normalerweise als verknüpfte Liste verstanden. Tatsächlich gibt es in der C ++ - Standardbibliothek bereits einen Container namens list - es handelt sich um eine doppelt verknüpfte Liste.
Andrej

3

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.


In der linearen Algebra, aus der "Vektor" in der Mathematik stammt, dreht sich alles um Operationen, wobei alle Vektoren gleich groß sind. Die lineare Algebra, also die Operationen , macht eine Reihe von Zahlen zu einem Vektor in der Mathematik.
E4z9

3

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.


Dies ist offensichtlich falsch, das ist nicht das, was ein Vektor ist. en.wikipedia.org/wiki/Vector_space
sara

@kai Diese Konflikte finden Sie auch in anderen Bereichen. Reelle Zahlen in einigen Programmiersprachen können nicht gespeichert 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. "
Johannes Schaub - litb

Was ein Vektor ist , hängt davon ab, wessen Definition Sie verwenden. Da diese Frage auf gebeten wurde , stackoverflow.com , anstatt auf math.stackexchange.com , würde ich hier für einen weniger Mathe-voreingenommen Ansatz argumentieren.
Johannes Schaub - litb

@kai Ich bin ziemlich vertraut mit der Definition von Vektor in Bezug auf Vektorräume. Ich bin auch mit den Definitionen der Informatik vertraut, bei denen ein Vektor lediglich eine Liste von Zahlen ist, die im Speicher benachbart sind, dh ein Array. Beachten Sie, dass auf der Disambiguierungsseite für Vektor in Wikipedia eine Bedeutung als 1D-Array angezeigt wird. Dies ist genau die gleiche Bedeutung, die für Vektorprozessoren verwendet wird, die es seit mindestens den 70er Jahren gibt. Daher ist die Definition, die ich gegeben habe, zwar nicht die strenge mathematische Definition, aber eine Definition der Informatik, wenn auch älter.
James Matta

3

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


2

Ich würde vermuten, dass es vom Begriff Zeilenvektor kommt . Auch Informatiker lieben es, sich neue Namen für Dinge auszudenken ...


2

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.


sichere mathematische Vektoren werden in vielen Dimensionen berücksichtigt. Wenn Sie damit meinen, dass der Vektor seine Größe ändert, kann er leicht der mathematischen "Betrachten Sie diesen Vektor in der Dimension x" entsprechen, indem Sie Koordinaten hinzufügen oder abschneiden. Eine einfache lineare Transformation kann Vektoren vom n-dim-Raum auf Vektoren im m-dim-Raum abbilden. Mathematische Vektoren sind SEHR dynamisch.
4pie0

1

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.


1

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 nxmaufgerufene Matrix vor A, ndie der Anzahl der Zeilen und mder 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 ABereichs ausführen und auch die AGröße nicht erweitern . Dies bedeutet, dass Sie nicht auf einen Index von [n + 1]und / oder verweisen können [m + 1].

Nun Aleitet 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 Amit 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.


0

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.


-2

es kommt von der Struktur der Matrix, die aus Vektoren aufgebaut ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.