A pergunta é realmente auto-explicativa. Eu sei vagamente sobre vetores em matemática, mas realmente não vejo o link para vetores C ++.
A pergunta é realmente auto-explicativa. Eu sei vagamente sobre vetores em matemática, mas realmente não vejo o link para vetores C ++.
Respostas:
A definição matemática de um vetor é um membro do conjunto S
n
, que é uma sequência ordenada de valores em um conjunto específico ( S
). É isso que um C ++ vector
armazena.
std::vector
nã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.
É 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.
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."
Só para dizer por que provavelmente não é chamado array
: porque std::vector
tem um tamanho dinâmico. Uma matriz conceitualmente é fixa em comprimento. A seguir, o C ++ Standard, a propósito, possui um std::array
modelo com tamanho fixo e deve ser preferido em relação a uma matriz simples:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
não seria bom.
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.
É 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::vector
suporta todos eles (não diretamente, mas por meio dos recursos do C ++); portanto, pode ser chamado de vetor, mas é apenas coloquialismo e, por exemplo, Vallaray
apontado por Bjarne Stroustrup em "Linguagem de programação C ++", suporta alguns deles diretamente.
std::vector
não suporta operações aritméticas e, portanto, todas essas propriedades são indefinidas para a std::vector
. Portanto, a std::vector
não se qualifica como um vetor. Eu teria chamado dynamic_array
ou resizable_array
que lhe diz o que é.
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.
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.
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. "
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".
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 ...
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.
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.
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 nxm
matriz chamada A
, onde n
corresponde ao número de linhas e m
corresponde 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 A
intervalo e também não pode estender A
o 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 A
deriva 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 A
com 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.
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.