web-dev-qa-db-fra.com

Pourquoi un vecteur C ++ est-il appelé vecteur?

La question est vraiment assez explicite. Je connais vaguement les vecteurs en mathématiques, mais je ne vois pas vraiment le lien avec les vecteurs C++.

129
Skilldrick

La définition mathématique d'un vecteur est membre de l'ensemble Sn, qui est une séquence ordonnée de valeurs dans un ensemble spécifique (S). C'est ce que stocke un C++ vector.

102
Mehrdad Afshari

C'est ce qu'on 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 fait une erreur, car les mathématiques utilisent déjà le terme "vecteur" pour une séquence de nombres de longueur fixe. Maintenant, C++ 0X va aggraver cette erreur en introduisant un "tableau" de classe qui se comportera comme un vecteur mathématique.

Leçon d'Alex: soyez très prudent chaque fois que vous nommez quelque chose.

168
Mark Ruzon

Un extrait de The C++ Programming Language par Bjarne Stroustrup:

"On pourrait faire valoir que valarray aurait dû être appelé vector car il s'agit d'un vecteur mathématique traditionnel et que vector aurait dû être appelé array. Cependant, ce n'est pas ainsi que la terminologie a évolué. "

50
aib

Le nom vient de l'algèbre linéaire, où le vecteur est une matrice avec une seule colonne ou une seule ligne.

15
vartec

Juste pour dire pourquoi il ne s'appelle probablement pas array: Parce que std::vector a une taille dynamique. Un tableau est conceptuellement de longueur fixe. Le standard C++ suivant a d'ailleurs std::array modèle, dont la taille est fixe et doit être préféré à un tableau simple:

std::array<int, 4> f = { 1, 2, 3, 4 };
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 avait donné à des structures de données similaires.

Plus tard, il admet qu'il avait tort parce que C++ vector 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 dans une communauté de 5 millions de personnes, donc l'erreur est susceptible de durer pour toujours.

7

De plus, si vous lui faites stocker des entiers ou des virgules flottantes, il constitue un excellent type pour stocker N vecteurs dimensionnels. Après tout, tout un vecteur est une liste de nombres conservés dans un ordre spécifique.

4
James Matta

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 que 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 conservées, l'aspect important est principalement la structure.

3
unwind

Il y a longtemps, en le langage B il existe des types de vecteurs. Ensuite, le langage C les a appelés "tableaux". Ensuite, le C avec les classes et le langage C++ viennent de le dériver ...

Ce n'est certainement pas toute l'histoire. Comme mentionné ci-dessus, Stepanov a pris la décision réelle. Mais si "vector" était toujours utilisé en C, le résultat semble peut-être très différent.

PS. Je me demande pourquoi C renomme "tableau". Quelle en était la raison exacte?

PS2. IMO pour un langage comme C++, un tableau signifie mieux "un type de maintenir les éléments à un accès raisonnable via l'opérateur []" (c'est-à-dire pas 42 [some_array_object]), par ex. une instanciation de std :: map comme un "tableau associatif".

3
FrankHB

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 était simplement choisi. Ce vecteur n'est pas le même que le vecteur de méthématique car en mathématiques les vecteurs sont membres de n'importe quel 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 du champ F ) et ces opérations satisfaire 8 axiomes:


Associativité de l'addition

u + (v + w) = (u + v) + w

Commutativité de l'addition

u + v = v + u

élément d'identité à ajouter

Il existe un élément 0 ∈ V , appelé vecteur zéro , tel que v + 0 = v pour tous v ∈ V .

éléments inverses d'addition

Pour chaque v ∈ V, il existe un élément −v ∈ V , appelé inverse additif de v, tel que v + (−v) =

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++ std::vector les supporte tous (pas directement, mais via les fonctionnalités C++), donc on peut l'appeler en quelque sorte un vecteur, mais c'est juste du langage courant et par exemple Vallaray souligné par Bjarne Stroustrup dans "C++ Programming Language" prend en charge certains d'entre eux directement.

3
4pie0

Je suppose que cela vient du terme vecteur ligne . De plus, les informaticiens adorent trouver de nouveaux noms pour les choses ...

2
anon

Aucune idée de la vraie raison, mais C++ l'appelle 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.

1
Robert Gould

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 matrice nxm 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 la plage de A et vous ne pouvez pas non plus étendre la taille de A. Cela signifie que vous ne pouvez pas vous référer à un index de [n + 1] et/ou [m + 1].

Maintenant, un vecteur de A dérive également ces attributs, tandis que leurs dimensions seront toujours 1xm (tout [i] ligne sélectionnée dans A) ou nx1 (tout [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 - que ce soit le [i] vecteur de colonne de A avec les dimensions de 1xm - peut être interprété comme une matrice.

L'important est que vous ne pouvez pas modifier les dimensions d'un vecteur une fois qu'il a été introduit en termes de mathématiques.

vecteurs en C++

En C++, les vecteurs sont exactement 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 le terme dimensions en termes de vecteurs C++, lorsque vous avez un vecteur de vecteurs: std::vector<std::vector<T>>> ragged_array. Dans cet exemple, j'ai appelé ce vecteur "en lambeaux", car il montre comment la taille de chaque vecteur de ce vecteur peut être modifiée indépendamment. Il viole non seulement 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 il montre également comment il ne peut pas être utilisé comme matrice.

1
zaug

mais les vecteurs mathématiques ne sont pas dynamiques, je n'ai jamais vu un seul changement de 2D à 3D ou quoi que ce soit d'autre, si quoi que ce soit des tableaux traditionnels font de meilleurs vecteurs.

1
user137

Se demande ce que la paramétrisation sur les types fait aux noms.

ici une colonne est dynamitée .. (voir la source pour certaines compétences d'encodage HTML ASP.NET côté serveur)

ou était-ce une rangée?

Là encore, en y pensant dans MIMD ou même SSE contexte machine vectorielle, le nom sonne toujours aussi bien).

0
rama-jka toti