La pregunta realmente se explica por sí misma. Sé vagamente acerca de los vectores en matemáticas, pero realmente no veo el enlace a los vectores C ++.
La pregunta realmente se explica por sí misma. Sé vagamente acerca de los vectores en matemáticas, pero realmente no veo el enlace a los vectores C ++.
Respuestas:
La definición matemática de un vector es un miembro del conjunto S
n
, que es una secuencia ordenada de valores en un conjunto específico ( S
). Esto es lo que vector
almacena un C ++ .
std::vector
no proporcionan, 3. El argumento de que std::vector
es una secuencia ordenada de valores podría aplicarse a std::list
, std::deque
, std::basic_string
, etc.
Se llama vector porque Alex Stepanov, el diseñador de la Biblioteca de plantillas estándar, estaba buscando un nombre para distinguirlo de las matrices integradas. Ahora admite que cometió un error, porque las matemáticas ya usan el término 'vector' para una secuencia de números de longitud fija. C ++ 11 agrava este error al introducir una clase 'matriz' que se comporta de manera similar a un vector matemático.
Lección de Alex: ten mucho cuidado cada vez que nombres algo.
Un extracto del lenguaje de programación C ++ de Bjarne Stroustrup:
"Se podría argumentar que valarray debería haberse llamado vector porque es un vector matemático tradicional y que ese vector debería haberse llamado matriz . Sin embargo, esta no es la forma en que evolucionó la terminología".
Solo para decir por qué probablemente no se llama array
: porque std::vector
tiene un tamaño dinámico. Una matriz conceptualmente tiene una longitud fija. El siguiente estándar de C ++ tiene una std::array
plantilla, que tiene un tamaño fijo y debe preferirse a una matriz simple:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
no sería bueno.
Para complementar la excelente respuesta de @MarkRuzon:
Alex dijo que para dar un nombre a lo que ahora se llama std :: vector, observó el nombre que Scheme y Common Lisp le habían dado a estructuras de datos similares.
Más tarde, admite que estaba equivocado porque el vector C ++ no tiene nada que ver con los vectores en matemáticas.
También dice que introdujo un error de una comunidad de 50 personas en una comunidad de 5 millones de personas, por lo que es probable que el error permanezca para siempre.
Es solo el nombre. El vector C ++ podría muy bien (o tal vez incluso más preciso) llamarse matriz dinámica o matriz redimensionable, pero este nombre simplemente se eligió . Este vector no es lo mismo que el vector de las matemáticas porque en las matemáticas los vectores son miembros de cualquier conjunto V, de modo que hay dos operaciones importantes definidas en este conjunto: + (suma de vectores) yx (multiplicación de un vector por un escalar del campo) F ) y estas operaciones satisfacen 8 axiomas :
Asociatividad de adición
u + (v + w) = (u + v) + w
La conmutatividad de la suma
u + v = v + u
Elemento de identidad de suma
Existe un elemento 0 ∈ V , llamado el vector cero , de modo que v + 0 = v para todo v ∈ V .
Elementos inversos de suma
Para cada v ∈ V, existe un elemento −v ∈ V , llamado inverso aditivo de v, de modo que v + (−v) = 0
Compatibilidad de la multiplicación escalar con la multiplicación de campo.
a (bv) = (ab) v
Elemento de identidad de multiplicación escalar.
1 v = v, donde 1 indica la identidad multiplicativa en F .
Distributividad de la multiplicación escalar con respecto a la suma de vectores
a (u + v) = au + av
Distributividad de la multiplicación escalar con respecto a la suma de campo
(a + b) v = av + bv
C ++ los std::vector
admite a todos (no directamente, sino a través de las características de C ++), por lo que de alguna manera puede llamarse un vector, pero es solo coloquialismo y, por ejemplo Vallaray
, Bjarne Stroustrup lo señaló en "Lenguaje de programación C ++" .
std::vector
, a no admite operaciones aritméticas y, por lo tanto, todas estas propiedades no están definidas para a std::vector
. Entonces a std::vector
no califica como vector. Lo habría llamado dynamic_array
o lo resizable_array
que te dice qué es.
Un vector es simplemente una secuencia de valores, todos del mismo tipo. Esto está bastante en línea con el uso en matemáticas. Supongo que la idea matemática de que los vectores deberían soportar algunas operaciones comunes (como sumar y escalar por un escalar) no se transfiere, el aspecto importante es principalmente la estructura.
Además, si hace que almacene enteros o puntos flotantes, es un tipo excelente para almacenar N vectores dimensionales. Después de todo, un vector es una lista de números mantenidos en un orden específico.
0.1
, mientras que en matemáticas, este valor es un miembro del conjunto de números reales. En el lenguaje de programación Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) un vector es "La clase Vector implementa una matriz de objetos que puede crecer. Como una matriz, contiene componentes que se puede acceder usando un índice entero. Sin embargo, el tamaño de un Vector puede crecer o reducirse según sea necesario para acomodar la adición y eliminación de elementos después de que se haya creado el Vector ".
Hace mucho tiempo, en el lenguaje B hay tipos de vectores. Entonces el lenguaje C los llamó "matrices". Luego, el C con clases y el lenguaje C ++ simplemente lo derivaron ...
Ciertamente, esta no es toda la historia. Como se mencionó anteriormente, Stepanov tomó la decisión real. Pero si todavía se usaba "vector" en C, el resultado puede parecer bastante diferente.
PD. Me pregunto por qué C cambia el nombre de "matriz". ¿Cuál fue la razón exacta?
PS2 OMI para un lenguaje como C ++, una matriz significa mejor "un tipo de elementos de retención a los que se puede acceder razonablemente a través del operador []" (es decir, no 42 [some_array_object]), por ejemplo, una instancia de std :: map como una "matriz asociativa".
Supongo que proviene del término vector de fila . Además, a los científicos informáticos les encanta pensar nuevos nombres para las cosas ...
pero los vectores matemáticos no son dinámicos, nunca he visto un cambio de 2D a 3D ni nada, si algo los arreglos tradicionales crean mejores vectores.
No tengo idea de la verdadera razón, pero C ++ lo llama un vector en lugar de una matriz, reduce la confusión entre las estructuras C y C ++, aunque cumplen los mismos roles.
Piense en un vector C ++ como una matriz dinámica, cuyo tamaño se puede alterar insertando o eliminando elementos. No están relacionados con la definición matemática del vector.
Vectores en Matemáticas
Considere una nxm
matriz llamada A
, donde n
corresponde al número de filas y m
corresponde al número de columnas. En un contexto matemático, una vez que introduce una matriz como esta, luego, no puede realizar ninguna operación fuera del A
rango y tampoco puede ampliar A
el tamaño. Lo que esto significa es que no puede hacer referencia a un índice de [n + 1]
y / o [m + 1]
.
Ahora, un vector A
deriva también estos atributos, mientras que sus dimensiones siempre serán 1xm
(cualquier [i]
fila seleccionada dentro A
) o nx1
(cualquier [j]
columna seleccionada dentro A
). Un vector tampoco se puede especificar como 2xn
, porque una colección de vectores no se puede interpretar como un vector, mientras que un vector, que sea el [i]
vector de columna A
con las dimensiones de 1xm
, se puede interpretar como una matriz.
La conclusión importante es que no se pueden cambiar las dimensiones de un vector una vez que se introduce en términos matemáticos.
Vectores en C ++
En C ++, los vectores son como los vectores en matemáticas, pero a diferencia de las matemáticas, su tamaño puede modificarse . Tamaño como término se aplica aquí porque implica el recuento de elementos que contiene un vector en particular.
Usted utilizar las dimensiones plazo en términos de vectores C ++, cuando se tiene un vector de vectores: std::vector<std::vector<T>>> ragged_array
. En este ejemplo, llamé a ese vector "desigual", porque demuestra cómo el tamaño de cada vector de ese vector puede alterarse independientemente. No solo viola las reglas de cómo no se pueden cambiar las dimensiones una vez que se introduce un vector particular en matemáticas, sino que también demuestra cómo no se puede usar como matriz.
Se pregunta que la parametrización en los tipos hace a los nombres.
aquí se arruina una columna ... (vea la fuente para algunas habilidades de codificación HTML ASP.NET del lado del servidor)
o fue una fila?
Por otra parte, pensando en el contexto de máquina de vectores MIMD o incluso SSE, el nombre todavía suena muy bien.