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 ++.
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 ++.
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 que vector
stocke un C ++ .
std::vector
ne prévoit pas, 3. L'argument selon lequel std::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.
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::vector
a une taille dynamique. Un tableau est conceptuellement de longueur fixe. La prochaine norme C ++ a d'ailleurs un std::array
modèle, dont la taille est fixe et qui devrait être préférée à un tableau simple:
std::array<int, 4> f = { 1, 2, 3, 4 };
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.
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 exemple Vallaray
souligné par Bjarne Stroustrup dans "C ++ Programming Language" en prend directement en charge certains.
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 a std::vector
. Donc, a std::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.
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.
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".
Je suppose que cela vient du terme vecteur de ligne . De plus, les informaticiens adorent inventer de nouveaux noms pour les choses ...
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.
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 nxm
matrice appelée A
, où n
correspond au nombre de lignes et m
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 de A
la plage de s et vous ne pouvez pas non plus étendre A
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 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 A
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.
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.