Pourquoi un vecteur C ++ est-il appelé un vecteur?
147
La question est vraiment assez explicite. Je connais vaguement les vecteurs en mathématiques, mais je ne vois pas vraiment le lien vers les vecteurs C ++.
Les vecteurs (Magnitute + direction) en physique est la première chose qui me frappe au moment où j'entends le mot vecteurs.
RBT
Réponses:
109
La définition mathématique d'un vecteur est un membre de l'ensemble Sn, qui est une séquence ordonnée de valeurs dans un ensemble spécifique ( S). C'est ce que vectorstocke un C ++ .
Les vecteurs ne sont généralement considérés que de 2 à 3 dimensions en raison de leur utilisation en physique. Mais plus généralement en mathématiques, ils signifient juste un ensemble de nombres qui a un ordre (les ensembles mathématiques sont sans ordre, ils sont comme un sac rempli de choses). Un vecteur peut avoir n'importe quel nombre d'éléments.
Joseph Garvin
8
vartec, un vecteur euclidien ne peut-il pas être représenté comme un vecteur de coordonnées et vice versa? Ce ne sont que des représentations différentes de la même chose (un tuple) dans l'espace euclidien par rapport à l'espace vectoriel plus général.
Calvin
6
@Joseph Garvin: Les vecteurs n'ont même pas besoin d'avoir des composants qui sont des nombres. Par exemple, certains ensembles de fonctions peuvent être utilisés pour former des espaces vectoriels où les composants sont des fonctions.
jason
13
Un vecteur est littéralement un «porteur». Le même mot est utilisé pour (par exemple) les insectes qui transmettent des maladies et provient de la même racine latine que «véhicule». C'est donc quelque chose qui vous emmène d'un endroit à un autre. Incidemment, le mot «matrice» vient aussi du latin, signifiant «ventre».
Artelius
7
Ceux - ci ne semble pas satisfaisante parce que: 1. vecteurs mathématiques ne changent pas en dimension, 2. vecteurs mathématiques ont des opérations qui std::vectorne prévoit pas, 3. L'argument selon lequel std::vectorest une séquence ordonnée de valeurs pourrait appliquer à std::list, std::deque, std::basic_string, etc.
jamesdlin
190
Cela s'appelle un vecteur car Alex Stepanov, le concepteur de la bibliothèque de modèles standard, cherchait un nom pour le distinguer des tableaux intégrés. Il admet maintenant qu'il a commis une erreur, car les mathématiques utilisent déjà le terme «vecteur» pour une séquence de nombres de longueur fixe. C ++ 11 aggrave cette erreur en introduisant un «tableau» de classe qui se comporte de la même manière qu'un vecteur mathématique.
Leçon d'Alex: soyez très prudent chaque fois que vous nommez quelque chose.
Mais le tableau n'utilisera pas non plus l'allocation de tas, ce qui rend le déplacement moins efficace. Nous avons également std :: valarray, btw.
sellibitze
1
Vous pouvez l'allouer sur le tas si un déplacement bon marché est souhaité.
2
C'est bien de savoir qu'ils ont appris cette leçon même s'il est trop tard. Bien que ... typedef ou #define puisse le corriger aussi.
LearnCocos2D
4
Il n'y a que deux choses difficiles en informatique: l'invalidation du cache et la dénomination des choses - Phil Karlton
RBT
8
si vous prétendez "[Alex Stepanov] admet maintenant qu'il a commis une erreur" dans votre réponse, pourriez-vous s'il vous plaît fournir une citation?
Trevor Boyd Smith
56
Un extrait du langage de programmation C ++ par Bjarne Stroustrup:
"On pourrait soutenir que valarray
aurait dû être appelé vecteur
parce que c'est un vecteur mathématique traditionnel et que ce vecteur
aurait dû être appelé tableau . Cependant, ce n'est pas ainsi que la terminologie a évolué."
Juste pour dire pourquoi il ne s'appelle probablement pas array: Parce qu'il std::vectora une taille dynamique. Un tableau est conceptuellement de longueur fixe. La prochaine norme C ++ a d'ailleurs un std::arraymodèle, dont la taille est fixe et qui devrait être préférée à un tableau simple:
Cette nouvelle norme C ++ a-t-elle déjà été publiée?
Johannes Jensen
1
ce n'est pas vraiment une réponse, car un vecteur a également une taille fixe. les vecteurs sont des valeurs pures, ce sont des éléments d'un ensemble qui, avec une structure supplémentaire, forment un espace vectoriel abstrait. la notion de "changer la taille" d'un vecteur est complètement absurde.
sara
@kai je pense qu'il y a une confusion ici. J'ai simplement expliqué pourquoi il ne s'appelle pas tableau . Je n'ai pas essayé d'expliquer pourquoi on l' appelle spécifiquement vecteur . Un tableau en C ++ avant même la standardisation du langage a toujours eu une taille fixe, donc nommer la classe redimensionnable std::arrayne serait pas bon.
Johannes Schaub - litb
maintenant, vous pouvez vous plaindre à juste titre que ce n'est pas vraiment une réponse, mais un commentaire valable. Dans la mesure où je suis d'accord avec la première demi-phrase (jusqu'à la virgule) de votre commentaire. Cependant, il est maintenant trop tard pour déplacer ma réponse dans un commentaire sur la question, car ces commentaires utiles de vous et de @ user12 seraient perdus.
Johannes Schaub - litb
En guise de compromis pour résoudre le dilemme, j'ai créé le wiki de la communauté de réponse. Cela supprime tous les points de vote à la hausse et les pertes de vote à la baisse que j'ai reçues de mon compte. Si quelqu'un veut encore me remercier pour mon ingénieux commentaire déguisé, il peut voter pour ce commentaire représentatif.
Johannes Schaub - litb
10
Pour compléter l'excellente réponse de @MarkRuzon:
Alex a dit que pour donner un nom à ce qu'on appelle maintenant std :: vector, il a observé le nom que Scheme et Common Lisp avaient donné à des structures de données similaires.
Plus tard, il admet qu'il avait tort parce que le vecteur C ++ n'a rien à voir avec les vecteurs en mathématiques.
Il dit également qu'il a introduit une erreur d'une communauté de 50 personnes à une communauté de 5 millions de personnes, donc l'erreur est susceptible de rester pour toujours.
C'est juste le nom. Le vecteur C ++ pourrait très bien (ou peut-être même plus précis) être appelé tableau dynamique ou tableau redimensionnable, mais ce nom a été simplement choisi . Ce vecteur n'est pas le même que le vecteur de la méthématique car en mathématiques les vecteurs sont membres de tout ensemble V tel qu'il y a deux opérations importantes définies sur cet ensemble: + (addition de vecteurs) et x (multiplication d'un vecteur par un scalaire de champ F ) et ces opérations satisfont 8 axiomes :
Associativité de l'addition
u + (v + w) = (u + v) + w
Commutativité de l'addition
u + v = v + u
Élément d'identité de l'addition
Il existe un élément 0 ∈ V , appelé le vecteur nul , tel que v + 0 = v pour tout v ∈ V .
Éléments d'addition inverses
Pour tout v ∈ V, il existe un élément −v ∈ V , appelé l' inverse additif de v, tel que v + (−v) = 0
Compatibilité de la multiplication scalaire avec la multiplication de champ
a (bv) = (ab) v
Élément d'identité de la multiplication scalaire
1 v = v, où 1 désigne l' identité multiplicative dans F .
Distributivité de la multiplication scalaire par rapport à l'addition vectorielle
a (u + v) = au + av
Distributivité de la multiplication scalaire par rapport à l'addition de champ
(a + b) v = av + bv
C ++ les std::vectorsupporte tous (pas directement, mais via des fonctionnalités C ++), donc il peut en quelque sorte être appelé un vecteur, mais c'est juste un langage familier et par exemple Vallaraysouligné par Bjarne Stroustrup dans "C ++ Programming Language" en prend directement en charge certains.
Aucun conteneur en C ++ n'a ce type d'arithmétique défini, donc il n'y a pas de vecteurs en C ++. En particulier, a std::vectorne prend pas en charge les opérations arithmétiques et, par conséquent, toutes ces propriétés ne sont pas définies pour a std::vector. Donc, a std::vectorn'est pas considéré comme un vecteur. Je l'aurais appelé dynamic_arrayouresizable_array qui vous dit ce que c'est.
user877329
4
Ou simplement "lister". Mais noooooo ... ça devait être "vectoriel" parce que c'est ce que tout le monde utilise, non?
LearnCocos2D
1
@ LearnCocos2D, eh bien, une liste est généralement considérée comme une liste liée. En fait, il existe déjà un conteneur appelé list dans la bibliothèque standard C ++ - c'est une liste doublement liée.
Andrej
3
Un vecteur est simplement une séquence de valeurs, toutes du même type. Cela correspond à peu près à l'utilisation en mathématiques. Je suppose que l'idée mathématique selon laquelle les vecteurs devraient prendre en charge certaines opérations courantes (telles que l'ajout et la mise à l'échelle par un scalaire) ne sont pas reportées, l'aspect important est principalement la structure.
En algèbre linéaire, d'où «vecteur» en mathématiques, tout est question d'opérations, tous les vecteurs ayant la même taille. L'algèbre linéaire, donc les opérations , est ce qui fait d'un tas de nombres un vecteur en mathématiques.
E4z9 le
3
De plus, si vous lui faites stocker des entiers ou des virgules flottantes, cela constitue un excellent type pour stocker des vecteurs dimensionnels. Après tout, un vecteur est une liste de nombres conservés dans un ordre spécifique.
@kai Vous trouverez également ces conflits dans d'autres domaines. Les nombres réels dans certains langages de programmation ne pourront pas stocker 0.1, alors qu'en mathématiques, cette valeur fait partie de l'ensemble des nombres réels. Dans le langage de programmation Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ), un vecteur est "La classe Vector implémente un tableau évolutif d'objets. Comme un tableau, elle contient des composants qui est accessible à l'aide d'un index entier. Cependant, la taille d'un vecteur peut augmenter ou diminuer selon les besoins pour permettre l'ajout et la suppression d'éléments après la création du vecteur. "
Johannes Schaub - litb
Quant à ce vecteur est , cela dépend dont la définition que vous utilisez. Comme cette question a été posée sur stackoverflow.com , plutôt que sur math.stackexchange.com , je plaiderais pour une approche moins biaisée en mathématiques ici.
Johannes Schaub - litb
@kai Je connais assez bien la définition du vecteur en ce qui concerne les espaces vectoriels. Je suis également familier avec les définitions informatiques, où un vecteur est simplement une liste de nombres adjacents en mémoire, c'est-à-dire un tableau. Notez que dans la page d'homonymie du vecteur dans wikipedia, ils montrent une signification pour être un tableau 1D. C'est précisément la même signification que celle utilisée pour les processeurs vectoriels, qui existent depuis au moins les années 70. Par conséquent, alors que la définition que j'ai donnée n'est pas la définition mathématique stricte, c'est une définition informatique, bien que plus ancienne.
James Matta
3
Il y a longtemps, dans le langage B, il y avait des types de vecteurs. Ensuite, le langage C les a appelés "tableaux". Ensuite, le C avec Classes et le langage C ++ l'ont juste dérivé ...
Ce n'est certainement pas toute l'histoire. Comme mentionné ci-dessus, Stepanov a pris la décision réelle. Mais si «vecteur» était encore utilisé en C, le résultat serait peut-être assez différent.
PS. Je me demande pourquoi C renomme "array". Quelle était la raison exacte?
PS2. IMO pour un langage comme C ++, un tableau signifie mieux "un type contient des éléments auxquels on peut raisonnablement accéder via l'opérateur []" (c'est-à-dire pas 42 [some_array_object]), par exemple une instanciation de std :: map comme un "tableau associatif".
mais les vecteurs mathématiques ne sont pas dynamiques, je n'ai jamais vu un seul changement de la 2D à la 3D ou quoi que ce soit d'autre, si quelque chose des tableaux traditionnels permet de meilleurs vecteurs.
certains vecteurs mathématiques sont considérés dans de nombreuses dimensions. Si en étant dynamique, vous voulez dire que le vecteur change de taille, il peut facilement correspondre à des mathématiques "considérer ce vecteur en dimension x" en ajoutant ou en tronquant des coordonnées. Une simple transformation linéaire peut mapper les vecteurs de l'espace n-dim en vecteurs dans l'espace m-dim. Les vecteurs mathématiques sont TRÈS dynamiques.
4pie0
1
Aucune idée de la vraie raison, mais C ++ en l'appelant un vecteur au lieu d'un tableau, réduit la confusion entre les structures C et C ++, bien qu'elles remplissent les mêmes rôles.
Considérez un vecteur C ++ comme un tableau dynamique, dont la taille peut être modifiée en insérant ou en supprimant des éléments. Ils ne sont pas liés à la définition mathématique du vecteur.
Vecteurs en mathématiques
Considérons une nxmmatrice appelée A, où ncorrespond au nombre de lignes et mcorrespond au nombre de colonnes. Dans un contexte mathématique, une fois que vous introduisez une matrice comme celle-ci, puis plus tard, vous ne pouvez effectuer aucune opération en dehors de Ala plage de s et vous ne pouvez pas non plus étendre Ala taille de. Cela signifie que vous ne pouvez pas faire référence à un index de [n + 1]et / ou [m + 1].
Désormais, un vecteur de Adérive également ces attributs, tandis que leurs dimensions seront toujours 1xm(toute [i]ligne sélectionnée dans A) ou nx1(toute [j]colonne sélectionnée dans A). Un vecteur ne peut pas non plus être spécifié comme 2xn, car une collection de vecteurs ne peut pas être interprétée comme un vecteur, tandis qu'un vecteur - soit le [i]vecteur colonne de Aavec les dimensions de1xm - peut être interprété comme une matrice.
L'important à retenir est que vous ne pouvez pas modifier les dimensions d'un vecteur une fois qu'il est introduit en termes de mathématiques.
Vecteurs en C ++
En C ++, les vecteurs sont comme des vecteurs en mathématiques, mais contrairement aux mathématiques, leur taille peut être modifiée . La taille en tant que terme s'applique ici car elle implique le nombre d'éléments qu'un vecteur particulier contient.
Vous utilisez les dimensions terme en termes de vecteurs de C, lorsque vous avez un vecteur de vecteurs: std::vector<std::vector<T>>> ragged_array. Dans cet exemple, j'ai appelé ce vecteur "déchiqueté", car il montre comment la taille de chaque vecteur de ce vecteur peut être modifiée indépendamment. Non seulement cela viole les règles selon lesquelles les dimensions ne peuvent pas être modifiées une fois qu'un vecteur particulier est introduit en mathématiques, mais cela démontre également comment il ne peut pas être utilisé comme matrice.
Réponses:
La définition mathématique d'un vecteur est un membre de l'ensemble
S
n
, qui est une séquence ordonnée de valeurs dans un ensemble spécifique (S
). C'est ce quevector
stocke un C ++ .la source
std::vector
ne prévoit pas, 3. L'argument selon lequelstd::vector
est une séquence ordonnée de valeurs pourrait appliquer àstd::list
,std::deque
,std::basic_string
, etc.Cela s'appelle un vecteur car Alex Stepanov, le concepteur de la bibliothèque de modèles standard, cherchait un nom pour le distinguer des tableaux intégrés. Il admet maintenant qu'il a commis une erreur, car les mathématiques utilisent déjà le terme «vecteur» pour une séquence de nombres de longueur fixe. C ++ 11 aggrave cette erreur en introduisant un «tableau» de classe qui se comporte de la même manière qu'un vecteur mathématique.
Leçon d'Alex: soyez très prudent chaque fois que vous nommez quelque chose.
la source
Un extrait du langage de programmation C ++ par Bjarne Stroustrup:
la source
Le nom vient de l'algèbre linéaire, où le vecteur est une matrice avec une seule colonne ou une seule ligne.
la source
Juste pour dire pourquoi il ne s'appelle probablement pas
array
: Parce qu'ilstd::vector
a une taille dynamique. Un tableau est conceptuellement de longueur fixe. La prochaine norme C ++ a d'ailleurs unstd::array
modèle, dont la taille est fixe et qui devrait être préférée à un tableau simple:la source
std::array
ne serait pas bon.Pour compléter l'excellente réponse de @MarkRuzon:
Alex a dit que pour donner un nom à ce qu'on appelle maintenant std :: vector, il a observé le nom que Scheme et Common Lisp avaient donné à des structures de données similaires.
Plus tard, il admet qu'il avait tort parce que le vecteur C ++ n'a rien à voir avec les vecteurs en mathématiques.
Il dit également qu'il a introduit une erreur d'une communauté de 50 personnes à une communauté de 5 millions de personnes, donc l'erreur est susceptible de rester pour toujours.
la source
C'est juste le nom. Le vecteur C ++ pourrait très bien (ou peut-être même plus précis) être appelé tableau dynamique ou tableau redimensionnable, mais ce nom a été simplement choisi . Ce vecteur n'est pas le même que le vecteur de la méthématique car en mathématiques les vecteurs sont membres de tout ensemble V tel qu'il y a deux opérations importantes définies sur cet ensemble: + (addition de vecteurs) et x (multiplication d'un vecteur par un scalaire de champ F ) et ces opérations satisfont 8 axiomes :
Associativité de l'addition
u + (v + w) = (u + v) + w
Commutativité de l'addition
u + v = v + u
Élément d'identité de l'addition
Il existe un élément 0 ∈ V , appelé le vecteur nul , tel que v + 0 = v pour tout v ∈ V .
Éléments d'addition inverses
Pour tout v ∈ V, il existe un élément −v ∈ V , appelé l' inverse additif de v, tel que v + (−v) = 0
Compatibilité de la multiplication scalaire avec la multiplication de champ
a (bv) = (ab) v
Élément d'identité de la multiplication scalaire
1 v = v, où 1 désigne l' identité multiplicative dans F .
Distributivité de la multiplication scalaire par rapport à l'addition vectorielle
a (u + v) = au + av
Distributivité de la multiplication scalaire par rapport à l'addition de champ
(a + b) v = av + bv
C ++ les
std::vector
supporte tous (pas directement, mais via des fonctionnalités C ++), donc il peut en quelque sorte être appelé un vecteur, mais c'est juste un langage familier et par exempleVallaray
souligné par Bjarne Stroustrup dans "C ++ Programming Language" en prend directement en charge certains.la source
std::vector
ne prend pas en charge les opérations arithmétiques et, par conséquent, toutes ces propriétés ne sont pas définies pour astd::vector
. Donc, astd::vector
n'est pas considéré comme un vecteur. Je l'aurais appelédynamic_array
ouresizable_array
qui vous dit ce que c'est.Un vecteur est simplement une séquence de valeurs, toutes du même type. Cela correspond à peu près à l'utilisation en mathématiques. Je suppose que l'idée mathématique selon laquelle les vecteurs devraient prendre en charge certaines opérations courantes (telles que l'ajout et la mise à l'échelle par un scalaire) ne sont pas reportées, l'aspect important est principalement la structure.
la source
De plus, si vous lui faites stocker des entiers ou des virgules flottantes, cela constitue un excellent type pour stocker des vecteurs dimensionnels. Après tout, un vecteur est une liste de nombres conservés dans un ordre spécifique.
la source
0.1
, alors qu'en mathématiques, cette valeur fait partie de l'ensemble des nombres réels. Dans le langage de programmation Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ), un vecteur est "La classe Vector implémente un tableau évolutif d'objets. Comme un tableau, elle contient des composants qui est accessible à l'aide d'un index entier. Cependant, la taille d'un vecteur peut augmenter ou diminuer selon les besoins pour permettre l'ajout et la suppression d'éléments après la création du vecteur. "Il y a longtemps, dans le langage B, il y avait des types de vecteurs. Ensuite, le langage C les a appelés "tableaux". Ensuite, le C avec Classes et le langage C ++ l'ont juste dérivé ...
Ce n'est certainement pas toute l'histoire. Comme mentionné ci-dessus, Stepanov a pris la décision réelle. Mais si «vecteur» était encore utilisé en C, le résultat serait peut-être assez différent.
PS. Je me demande pourquoi C renomme "array". Quelle était la raison exacte?
PS2. IMO pour un langage comme C ++, un tableau signifie mieux "un type contient des éléments auxquels on peut raisonnablement accéder via l'opérateur []" (c'est-à-dire pas 42 [some_array_object]), par exemple une instanciation de std :: map comme un "tableau associatif".
la source
Je suppose que cela vient du terme vecteur de ligne . De plus, les informaticiens adorent inventer de nouveaux noms pour les choses ...
la source
mais les vecteurs mathématiques ne sont pas dynamiques, je n'ai jamais vu un seul changement de la 2D à la 3D ou quoi que ce soit d'autre, si quelque chose des tableaux traditionnels permet de meilleurs vecteurs.
la source
Aucune idée de la vraie raison, mais C ++ en l'appelant un vecteur au lieu d'un tableau, réduit la confusion entre les structures C et C ++, bien qu'elles remplissent les mêmes rôles.
la source
Considérez un vecteur C ++ comme un tableau dynamique, dont la taille peut être modifiée en insérant ou en supprimant des éléments. Ils ne sont pas liés à la définition mathématique du vecteur.
Vecteurs en mathématiques
Considérons une
nxm
matrice appeléeA
, oùn
correspond au nombre de lignes etm
correspond au nombre de colonnes. Dans un contexte mathématique, une fois que vous introduisez une matrice comme celle-ci, puis plus tard, vous ne pouvez effectuer aucune opération en dehors deA
la plage de s et vous ne pouvez pas non plus étendreA
la taille de. Cela signifie que vous ne pouvez pas faire référence à un index de[n + 1]
et / ou[m + 1]
.Désormais, un vecteur de
A
dérive également ces attributs, tandis que leurs dimensions seront toujours1xm
(toute[i]
ligne sélectionnée dansA
) ounx1
(toute[j]
colonne sélectionnée dansA
). Un vecteur ne peut pas non plus être spécifié comme2xn
, car une collection de vecteurs ne peut pas être interprétée comme un vecteur, tandis qu'un vecteur - soit le[i]
vecteur colonne deA
avec les dimensions de1xm
- peut être interprété comme une matrice.L'important à retenir est que vous ne pouvez pas modifier les dimensions d'un vecteur une fois qu'il est introduit en termes de mathématiques.
Vecteurs en C ++
En C ++, les vecteurs sont comme des vecteurs en mathématiques, mais contrairement aux mathématiques, leur taille peut être modifiée . La taille en tant que terme s'applique ici car elle implique le nombre d'éléments qu'un vecteur particulier contient.
Vous utilisez les dimensions terme en termes de vecteurs de C, lorsque vous avez un vecteur de vecteurs:
std::vector<std::vector<T>>> ragged_array
. Dans cet exemple, j'ai appelé ce vecteur "déchiqueté", car il montre comment la taille de chaque vecteur de ce vecteur peut être modifiée indépendamment. Non seulement cela viole les règles selon lesquelles les dimensions ne peuvent pas être modifiées une fois qu'un vecteur particulier est introduit en mathématiques, mais cela démontre également comment il ne peut pas être utilisé comme matrice.la source
Se demande que la paramétrisation des types affecte les noms.
ici une colonne se fait exploser. (voir la source pour certaines compétences d'encodage HTML ASP.NET côté serveur)
ou était-ce une dispute?
Là encore, en y pensant dans le contexte de la machine vectorielle MIMD ou même SSE, le nom sonne toujours très bien.
la source
il vient de la structure de matrice qui construit à partir de vecteurs
la source