Por que um vetor C ++ é chamado vetor?


147

A pergunta é realmente auto-explicativa. Eu sei vagamente sobre vetores em matemática, mas realmente não vejo o link para vetores C ++.


5
Vetores (direção Magnitute +) na física é a primeira coisa que me ocorre na hora em que ouço a palavra vetores.
RBT

Respostas:


109

A definição matemática de um vetor é um membro do conjunto Sn, que é uma sequência ordenada de valores em um conjunto específico ( S). É isso que um C ++ vectorarmazena.


21
Os vetores são normalmente considerados apenas de 2 a 3 dimensões devido ao seu uso na física. Mas, geralmente, em matemática, eles significam apenas um conjunto de números que têm um pedido (os conjuntos matemáticos não têm ordem, são como uma sacola cheia de coisas). Um vetor pode ter qualquer número de elementos.
24730 Joseph Garvin

8
vartec, um vetor euclidiano não pode ser representado como um vetor de coordenadas e vice-versa? Eles são apenas representações diferentes da mesma coisa (uma tupla) no espaço euclidiano versus o espaço vetorial mais geral.
Calvin

6
@ Joseph Garvin: Os vetores nem precisam ter componentes que são números. Por exemplo, certos conjuntos de funções podem ser usados ​​para formar espaços vetoriais em que os componentes são funções.
Jason

13
Um vetor é literalmente um "portador". A mesma palavra é usada para (por exemplo) insetos que transmitem doenças e vem da mesma raiz latina de "veículo". Então é algo que leva você de um lugar para outro. Aliás, a palavra "matriz" também é do latim, significando "útero".
23910 Artelius

6
Estes não parece satisfatória, porque: 1. vetores matemáticos não mudam de dimensão, 2. vetores matemáticos têm operações que std::vectornão fornece, 3. O argumento de que std::vectoré uma seqüência ordenada de valores poderia se aplicar a std::list, std::deque, std::basic_string, etc.
jamesdlin

188

É chamado de vetor porque Alex Stepanov, o designer da Biblioteca de modelos padrão, estava procurando um nome para diferenciá-lo das matrizes internas. Ele admite agora que cometeu um erro, porque a matemática já usa o termo 'vetor' para uma sequência de números de comprimento fixo. O C ++ 11 compõe esse erro introduzindo uma classe 'array' que se comporta de maneira semelhante a um vetor matemático.

Lição de Alex: tenha muito cuidado sempre que nomear algo.


1
Mas o array também não usará a alocação de heap, o que torna a movimentação menos eficiente. Também temos std :: valarray, btw.
sellibitze

1
Você pode alocá-lo no heap, caso seja necessário mover barato.

2
É bom saber que eles aprenderam essa lição, mesmo que seja tarde demais. Embora ... typedef ou #define também possam corrigi-lo.
LearnCocos2D

4
Há apenas duas coisas difíceis em Ciência da Computação: cache invalidação e nomear as coisas - Phil Karlton
RBT

7
se você vai reivindicar "[Alex Stepanov] admite agora que ele cometeu um erro" em sua resposta, você poderia fornecer uma citação?
Trevor Boyd Smith

56

Um trecho da linguagem de programação C ++ de Bjarne Stroustrup:

"Alguém poderia argumentar que o valarray deveria ter sido chamado de vetor porque é um vetor matemático tradicional e esse vetor deveria ser chamado de matriz . No entanto, não é assim que a terminologia evolui."


51
Pfftt .. o que esse cara sabe. Eu nunca ouvi falar dessa pessoa "Bjarne Stroustrup".
Calvin

5
Eu só quero saber quantos dos upvotes do comentário anterior são realmente um resultado de um estouro negativo ...
rindeal

16

O nome vem da álgebra linear, onde o vetor é matriz com apenas uma coluna ou apenas uma linha.


10

Só para dizer por que provavelmente não é chamado array: porque std::vectortem um tamanho dinâmico. Uma matriz conceitualmente é fixa em comprimento. A seguir, o C ++ Standard, a propósito, possui um std::arraymodelo com tamanho fixo e deve ser preferido em relação a uma matriz simples:

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

Esse novo padrão C ++ já foi lançado?
Johannes Jensen

1
isso não é muita resposta, já que um vetor também tem tamanho fixo. vetores são valores puros, são elementos de um conjunto que, juntamente com alguma estrutura adicional, formam um espaço vetorial abstrato. a noção de "alterar o tamanho" de um vetor é um absurdo completo.
Sara

@ Kai eu acho que há uma confusão aqui. Eu apenas defendeu por isso que é não chamado conjunto . Não tentei explicar por que é chamado especificamente de vetor . Uma matriz em C ++ mesmo antes da padronização da linguagem sempre ter um tamanho fixo, portanto, nomear a classe redimensionável std::arraynão seria bom.
Johannes Schaub - litb

agora você pode reclamar com razão que isso não é uma resposta, mas um comentário válido. Na medida em que eu concordo com a primeira meia-frase (até a vírgula) do seu comentário. No entanto, agora é tarde demais para colocar minha resposta em um comentário sobre a pergunta, porque esses comentários úteis de você e do @ user12 seriam perdidos.
Johannes Schaub - litb

Como um compromisso para resolver o dilema, fiz a resposta wiki da comunidade. Isso remove todos os pontos positivos e negativos que recebi da minha conta. Se alguém ainda quiser me agradecer pelo meu engenhoso comentário disfarçado, poderá aprovar esse comentário representacional.
Johannes Schaub - litb

10

Para complementar a excelente resposta do @MarkRuzon:

Alex disse que, para dar um nome ao que agora é chamado std :: vector, ele observou o nome que Scheme e Common Lisp deram a estruturas de dados semelhantes.

Mais tarde, ele admite que estava errado porque o vetor C ++ não tem nada a ver com os vetores em matemática.

Ele também diz que introduziu um erro de uma comunidade de 50 pessoas para uma comunidade de 5 milhões de pessoas, portanto o erro provavelmente permanecerá para sempre.


5

É apenas o nome. O vetor C ++ poderia muito bem (ou talvez ainda mais preciso) ser chamado de matriz dinâmica ou matriz redimensionável, mas esse nome foi simplesmente escolhido . Este vector não é o mesmo que o vector de methematics porque em matemática vectores são membros de qualquer conjunto V de tal forma que existem duas importantes operações definidas sobre este conjunto: + (adição de vectores) e x (multiplicação de um vector por um escalar de campo F ) e essas operações satisfazem 8 axiomas :


Associatividade de adição

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

Comutatividade de adição

u + v = v + u

Elemento de identificação da adição

Existe um elemento 0 ∈ V , chamado o vector de zero , de modo a que v + 0 = v para todo v ∈ V .

Elementos inversos de adição

Para todo v ∈ V, existe um elemento −v ∈ V , chamado inverso aditivo de v, de modo que v + (−v) = 0

Compatibilidade da multiplicação escalar com multiplicação de campos

a (bv) = (ab) v

Elemento de identidade da multiplicação escalar

1 v = v, onde 1 denota a identidade multiplicativo em F .

Distribuição da multiplicação escalar em relação à adição de vetores  

a (u + v) = au + av

Distribuibilidade da multiplicação escalar em relação à adição de campo

(a + b) v = av + bv


O C ++ std::vectorsuporta todos eles (não diretamente, mas por meio dos recursos do C ++); portanto, pode ser chamado de vetor, mas é apenas coloquialismo e, por exemplo, Vallarayapontado por Bjarne Stroustrup em "Linguagem de programação C ++", suporta alguns deles diretamente.


3
Nenhum contêiner em C ++ tem esse tipo de aritmética definido, portanto, não há vetores em C ++. Em particular, a std::vectornão suporta operações aritméticas e, portanto, todas essas propriedades são indefinidas para a std::vector. Portanto, a std::vectornão se qualifica como um vetor. Eu teria chamado dynamic_arrayou resizable_arrayque lhe diz o que é.
user877329

4
Ou simplesmente "lista". Mas noooooo ... tinha que ser "vetor" porque é isso que todo mundo usa, né?
LearnCocos2D

1
@ LearnCocos2D, bem, uma lista geralmente é entendida como uma lista vinculada. De fato, já existe um contêiner chamado list na biblioteca padrão C ++ - é uma lista duplamente vinculada.
Andrej

3

Um vetor é simplesmente uma sequência de valores, todos do mesmo tipo. Isso está bastante alinhado com o uso em matemática. Eu acho que a idéia matemática de que vetores devem suportar algumas operações comuns (como adicionar e dimensionar por um escalar) não é transferida, o aspecto importante é principalmente a estrutura.


Na álgebra linear, de onde o "vetor" vem da matemática, tudo é sobre operações, com todos os vetores do mesmo tamanho. A álgebra linear, assim como as operações , é o que faz um monte de números um vetor em matemática.
E4z9 24/04

3

Além disso, se você armazenar números inteiros ou pontos flutuantes, ele será um excelente tipo para armazenar vetores dimensionais em N. Afinal, um vetor é, é uma lista de números mantidos em uma ordem específica.


este é obviamente falsas, que não é o que um vetor é en.wikipedia.org/wiki/Vector_space
sara

@kai Você também encontrará esses conflitos em outras áreas. Números reais em algumas linguagens de programação não serão capazes de armazenar 0.1, enquanto na matemática esse valor é um membro do conjunto de números reais. Na linguagem de programação Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ), um vetor é "A classe Vector implementa uma matriz crescente de objetos. Como uma matriz, ela contém componentes que pode ser acessado usando um índice inteiro. No entanto, o tamanho de um vetor pode aumentar ou diminuir conforme necessário para acomodar a adição e remoção de itens após a criação do vetor. "
Johannes Schaub - litb

Quanto ao que um vetor é , depende de cuja definição você usa. Como essa pergunta foi feita no stackoverflow.com , em vez de no math.stackexchange.com , eu argumentaria por uma abordagem menos tendenciosa na matemática aqui.
Johannes Schaub - litb

@kai Estou familiarizado com a definição de vetor no que diz respeito aos espaços vetoriais. Também estou familiarizado com as definições de ciência da computação, onde um vetor é apenas uma lista de números adjacentes na memória, ou seja, uma matriz. Observe que na página de desambiguação do vetor na wikipedia, eles mostram um significado para ser uma matriz 1D. Este é precisamente o mesmo significado usado para processadores de vetores, que existem desde pelo menos os anos 70. Portanto, embora a definição que dei não seja estritamente uma definição matemática, é uma definição de ciência da computação, embora mais antiga.
James Matta

3

Há muito tempo, na linguagem B existem tipos de vetores. Então a linguagem C os chamou de "matrizes". Então o C com Classes e a linguagem C ++ apenas o derivaram ...

Certamente essa não é a história toda. Como mencionado acima, Stepanov tomou a decisão real. Mas se "vetor" ainda foi usado em C, o resultado talvez pareça bem diferente.

PS. Gostaria de saber por que C renomeia "matriz". Qual foi o motivo exato?

PS2. OMI para uma linguagem como C ++, uma matriz significa melhor "um elemento de retenção de tipo para ser razoavelmente acessado via operador []" (ou seja, não 42 [some_array_object]), por exemplo, uma instanciação de std :: map como uma "matriz associativa".


2

Eu acho que vem do termo vetor de linha . Além disso, os cientistas da computação adoram pensar em novos nomes para as coisas ...


2

mas vetores matemáticos não são dinâmicos, nunca vi uma alteração de 2D para 3D ou qualquer outra coisa, se alguma matriz tradicional criar melhores vetores.


Certos vetores matemáticos são considerados em várias dimensões. Se, por ser dinâmico, você quer dizer que o vetor altera seu tamanho, pode facilmente corresponder à matemática "considere esse vetor na dimensão x" adicionando ou truncando coordenadas. Uma transformação linear simples pode mapear vetores do espaço n-dim para vetores no espaço m-dim. Os vetores matemáticos são MUITO dinâmicos.
usar o seguinte comando

1

Nenhuma idéia sobre o motivo real, mas o C ++ chamando-o de vetor em vez de uma matriz reduz a confusão entre as estruturas C e C ++, embora elas cumpram as mesmas funções.


1

Pense em um vetor C ++ como uma matriz dinâmica, cujo tamanho pode ser alterado inserindo ou removendo elementos. Eles não estão relacionados à definição matemática do vetor.

Vetores em Matemática

Considere uma nxmmatriz chamada A, onde ncorresponde ao número de linhas e mcorresponde ao número de colunas. Em um contexto matemático, depois de introduzir uma matriz como essa, mais tarde, você não pode executar nenhuma operação fora do Aintervalo e também não pode estender Ao tamanho. O que isso significa é que você não pode se referir a um índice de [n + 1]e / ou [m + 1].

Agora, um vetor também Aderiva esses atributos, enquanto suas dimensões sempre serão 1xm(qualquer [i]linha selecionada dentro A) ou nx1(qualquer [j]coluna selecionada dentro A). Um vetor também não pode ser especificado como 2xn, porque uma coleção de vetores não pode ser interpretada como um vetor, enquanto um vetor - que seja o [i]vetor da coluna Acom as dimensões de 1xm- pode ser interpretado como uma matriz.

O importante é que você não pode alterar as dimensões de um vetor depois que ele é introduzido em termos de matemática.

Vetores em C ++

Em C ++, vetores são como vetores em matemática, mas, diferentemente da matemática, seu tamanho pode ser alterado . O tamanho como termo se aplica aqui porque implica na contagem de elementos que um vetor específico contém.

Você usa as dimensões prazo em termos de vetores C ++, quando você tem um vetor de vetores: std::vector<std::vector<T>>> ragged_array. Neste exemplo, chamei esse vetor de "irregular", porque demonstra como o tamanho de cada vetor desse vetor pode ser alterado independentemente. Ele não apenas viola as regras de como as dimensões não podem ser alteradas depois que um vetor específico é introduzido na matemática, mas também demonstra como ele não pode ser usado como matriz.


0

Imagina que a parametrização nos tipos faz com os nomes.

aqui uma coluna é explodida .. (veja a fonte de algumas habilidades de codificação HTML do ASP.NET no servidor)

ou foi uma briga?

Por outro lado, pensando nisso no contexto da máquina vetorial MIMD ou SSE, o nome ainda soa muito bom.


-2

vem da estrutura da matriz que constrói a partir de vetores

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.