¿Por qué un Vector C ++ se llama Vector?


147

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


55
Los vectores (Magnitute + dirección) en física son lo primero que me viene a la mente en el momento en que escucho la palabra vectores.
RBT

Respuestas:


109

La definición matemática de un vector es un miembro del conjunto Sn, que es una secuencia ordenada de valores en un conjunto específico ( S). Esto es lo que vectoralmacena un C ++ .


21
Los vectores generalmente solo se consideran de 2 a 3 dimensiones debido a su uso en física. Pero, en general, en matemáticas, solo significan un conjunto de números que tiene un orden (los conjuntos matemáticos no tienen orden, son como una bolsa llena de cosas). Un vector puede tener cualquier cantidad de elementos.
Joseph Garvin

8
vartec, ¿no se puede representar un vector euclidiano como un vector de coordenadas y viceversa? Son simplemente representaciones diferentes de la misma cosa (una tupla) en el espacio euclidiano frente al espacio vectorial más general.
Calvin el

66
@Joseph Garvin: los vectores ni siquiera necesitan tener componentes que sean números. Por ejemplo, ciertos conjuntos de funciones se pueden usar para formar espacios vectoriales donde los componentes son funciones.
Jason

13
Un vector es literalmente un "portador". La misma palabra se usa para (p. Ej.) Insectos que transmiten enfermedades, y proviene de la misma raíz latina que "vehículo". Entonces es algo que te lleva de un lugar a otro. Por cierto, la palabra "matriz" también es del latín, que significa "matriz".
Artelius

77
Estos no parece satisfactoria debido a que: 1. Los vectores matemáticos no cambian de dimensión, 2. vectores matemáticos tienen operaciones que std::vectorno proporcionan, 3. El argumento de que std::vectores una secuencia ordenada de valores podría aplicarse a std::list, std::deque, std::basic_string, etc.
jamesdlin

190

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.


1
Pero la matriz tampoco utilizará la asignación de montón, lo que hace que moverla sea menos eficiente. También tenemos std :: valarray, por cierto.
sellibitze

1
Puede asignarlo en el montón si se desea un movimiento barato.

2
Es bueno saber que aprendieron esa lección a pesar de que es demasiado tarde. Aunque ... typedef o #define también pueden arreglarlo.
LearnCocos2D

44
Solo hay dos cosas difíciles en informática: invalidación de caché y nombrar cosas - Phil Karlton
RBT

8
si va a reclamar "[Alex Stepanov] admite ahora que cometió un error" en su respuesta, ¿podría proporcionar una cita?
Trevor Boyd Smith

56

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


51
Pfftt ... ¿qué sabe ese tipo? Nunca he oído hablar de esta persona "Bjarne Stroustrup".
Calvin

55
Me pregunto cuántos de los upvotes del comentario anterior son en realidad el resultado de un flujo inferior ...
rindeal

16

El nombre proviene del álgebra lineal, donde el vector es matriz con solo una columna o solo una fila.


10

Solo para decir por qué probablemente no se llama array: porque std::vectortiene un tamaño dinámico. Una matriz conceptualmente tiene una longitud fija. El siguiente estándar de C ++ tiene una std::arrayplantilla, que tiene un tamaño fijo y debe preferirse a una matriz simple:

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

¿Ya se ha lanzado ese nuevo estándar C ++?
Johannes Jensen

1
Esto no es una gran respuesta, ya que un vector también tiene un tamaño fijo. Los vectores son valores puros, son elementos de un conjunto que junto con alguna estructura adicional forman un espacio vectorial abstracto. La noción de "cambiar el tamaño" de un vector no tiene sentido.
sara

@kai, creo que hay una confusión aquí. Sólo he abogado por eso que se no llama matriz . No he tratado de explicar por qué se llama específicamente vector . Una matriz en C ++ incluso antes de la estandarización del lenguaje siempre ha tenido un tamaño fijo, por lo que nombrar la clase redimensionable std::arrayno sería bueno.
Johannes Schaub - litb

ahora puede quejarse con razón de que esta no es una gran respuesta, sino un comentario válido. En la medida en que estoy de acuerdo con la primera media frase (hasta la coma) de su comentario. Sin embargo, ahora es demasiado tarde para mover mi respuesta a un comentario sobre la pregunta, porque estos útiles comentarios de usted y @ user12 se perderían.
Johannes Schaub - litb

Como compromiso para resolver el dilema, he hecho la wiki de la comunidad de respuestas. Esto elimina todos los puntos de voto positivo y las pérdidas de voto negativo que obtuve de mi cuenta. Si alguien todavía quiere agradecerme por mi ingenioso comentario disfrazado, puede votar este comentario representativo.
Johannes Schaub - litb

10

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.


5

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::vectoradmite 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 ++" .


3
Ningún contenedor en C ++ tiene ese tipo de aritmética definida, por lo que no hay vectores en C ++. En particular 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::vectorno califica como vector. Lo habría llamado dynamic_arrayo lo resizable_arrayque te dice qué es.
user877329

44
O simplemente "lista". Pero noooooo ... tenía que ser "vector" porque eso es lo que todos usan, ¿verdad?
LearnCocos2D

1
@ LearnCocos2D, bueno, una lista generalmente se entiende como una lista vinculada. De hecho, ya hay un contenedor llamado lista en la biblioteca estándar de C ++: es una lista doblemente vinculada.
Andrej

3

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.


En el álgebra lineal, de donde proviene el "vector" en matemáticas, todo se trata de operaciones, con todos los vectores del mismo tamaño. El álgebra lineal, por lo tanto, las operaciones , es lo que hace que un grupo de números sea un vector en matemáticas.
E4z9

3

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.


esto es descaradamente falso, eso no es lo que es un vector en.wikipedia.org/wiki/Vector_space
sara

@kai También encontrarás estos conflictos en otras áreas. Los números reales en algunos lenguajes de programación no podrán almacenarse 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 ".
Johannes Schaub - litb

En cuanto a lo que un vector es , depende de cuya definición se utiliza. Como esta pregunta se hizo en stackoverflow.com , en lugar de en math.stackexchange.com , argumentaría a favor de un enfoque menos sesgado por las matemáticas aquí.
Johannes Schaub - litb

@kai Estoy bastante familiarizado con la definición de vector con respecto a los espacios vectoriales. También estoy familiarizado con las definiciones de informática, donde un vector es simplemente una lista de números adyacentes en la memoria, es decir, una matriz. Tenga en cuenta que en la página de desambiguación para el vector en wikipedia muestran que un significado es ser una matriz 1D. Este es precisamente el mismo significado que se utiliza para los procesadores de vectores, que han existido desde al menos los años 70. Por lo tanto, si bien la definición que proporcioné no es la definición matemática estricta, es una definición informática, aunque más antigua.
James Matta

3

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


2

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


2

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.


ciertos vectores matemáticos se consideran en muchas dimensiones. Si al ser dinámico quiere decir que el vector cambia su tamaño, entonces puede corresponder fácilmente a la matemática "considere este vector en la dimensión x" agregando o truncando coordenadas. Una transformación lineal simple puede mapear vectores del espacio n-dim a vectores en el espacio m-dim. Los vectores matemáticos son MUY dinámicos.
4pie0

1

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.


1

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 nxmmatriz llamada A, donde ncorresponde al número de filas y mcorresponde 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 Arango y tampoco puede ampliar Ael 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 Aderiva 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 Acon 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.


0

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.


-2

proviene de la estructura de matriz que se construye a partir de vectores

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.