Member of The Internet Defense League

Array versus Vector

By borfast

Este é mais um serviço público que presto de bom grado, desta feita para o pessoal da programação de computadores, em particular alunos e (espantem-se) professores: arrays e vectores não são a mesma coisa!

Um array é, na sua essência, apenas um bloco de memória suficientemente grande para armazenar um número concreto de objectos. Se estivermos a programar um sistema em que um carácter ASCII ocupa exactamente 1 byte, então um array de 10 caracteres vai ocupar exactamente 10 bytes. Se forem longs e cada long ocupar 4 bytes, um array de 10 longs corresponderá a um bloco de memória de 40 bytes.

Outra característica dos arrays é que se criamos um array de 10 elementos, sejam eles inteiros, chars, ou outra coisa qualquer, o array vai manter aquele tamanho até ser destruído. De notar que isto não se aplica a algumas linguagens, particularmente linguagens de "scripting".

Geralmente um array não é mais do que um apontador para o início do bloco de memória que representa. Quando acedemos a um elemento do array através de parêntesis rectos, o que estamos a fazer é usar o apontador do array como endereço base e dizer-lhe para "avançar" X bytes na memória.
Por exemplo, imaginemos o array int[] myarray = new int[10], ocupando cada int exactamente 2 bytes. Este array vai apontar para um bloco de memória de 20 bytes. Supondo que esse bloco de memória começa no endereço 0x0050, o primeiro elemento do array ocupará a memória de 0x0050 a 0x0051 (2 bytes), o segundo elemento estará no espaço de memória de 0x0052 a 0x0053, o terceiro em 0x0054 a 0x0055, e por aí fora.

Ao acedermos a myarray[2], o que estamos a fazer é adicionar ao endereço base do array o número de bytes ocupado pelo tipo de elementos, multiplicado pelo número de elementos que queremos passar à frente. Neste caso queremos o 3º elemento (índice a começar em 0), portanto começando no endereço base temos 0x0050 + 2 * 2 = 0x0054. Como é um int e um int ocupa dois bytes, é só ler os bytes 0x0054 e 0x0055 e temos o nosso elemento.

E o que é que acontece se tentarmos aceder a myarray[10] (11º elemento) ou myarray[11] (12º elemento)? Estaremos a aceder a elementos que não pertencem ao array, pois as contas anteriores levar-nos-iam para endereços de memória que já estariam fora do mesmo. Se só quisermos ler, vamos acabar com valores imprevisíveis, pois não sabemos o que é que está fora do array. Se escrevermos para lá alguma coisa, podemos estoirar com o nosso programa por estarmos a mexer onde não devemos.

Isto tudo para explicar que esta é uma das grandes diferenças entre um vector e um array - um vector bem implementado não permitiria o acesso a secções de memória que não lhe pertencessem.

Um vector é uma estrutura de dados um pouco mais complexa que um array e, apesar de geralmente funcionar praticamente como um, permitindo o acesso indexado aos seus elementos, o que acontece "lá dentro" é muito diferente. Um vector é um array "dinâmico". Para o pessoal da geração Java, outro exemplo de um array dinâmico são as ArrayLists. Para o pessoal do PHP, os arrays nativos de PHP já são arrays dinâmicos. E haverá muitos outros exemplos de arrays dinâmicos largamente utilizados mas a ideia crítica aqui é que os arrays no seu conceito mais tradicional não são dinâmicos.

Um vector regra geral tem arrays "lá dentro" mas não lhes acedemos directamente, ao contrário do que acontece com arrays simples. Um vector fornece alguma forma de acesso para consulta e manipulação aos dados que contém mas nós, enquanto utilizadores do vector, não precisamos de nos preocupar (até certo ponto) com o tamanho do vector (ao contrário do que acontece com arrays), pois este deve poder crescer à medida que for ficando cheio. Isto é geralmente implementado alocando outro array e guardando os novos elementos nesse novo array. Claro que isto significa que o vector tem de saber onde é que os elementos estão guardados, para poder encontrar os nossos dados quando já tiver crescido várias vezes.

Para além disto, um vector oferece normalmente outras funcionalidades, como iteradores, possibilidade de saber se contém um determinado elemento, possibilidade de crescer ou decrescer por ordem do utilizador, entre muitas outras coisas que ficam ao critério de quem o implementa.

Como vêem, um vector não é a mesma coisa que um array, portanto por favor, professores (especialmente os professores) e alunos, parem de usar os dois termos como se fossem sinónimos. Já basta as universidades andarem a desleixar-se no ensino da programação, não são precisas mais ideias erradas na cabeça de quem está a aprender estas coisas.

5 comments

By Anónimo (not verified)
4 years 9 weeks ago

Mto bem!

Mto bem!

By Tiago Vale (not verified)
4 years 8 weeks ago

Pois... Array realmente não é

Pois... Array realmente não é a mesma coisa que a CLASSE VECTOR disponível em Java/C++ e muito provavelmente imensas outras linguagens.

Mas um array, vector e até mesmo tabela são termos usados para designar o mesmo. Até porque o array em si é a implementação a noção matemática de vector. Vector!

By borfast
4 years 8 weeks ago

Não precisa de ser uma

Não precisa de ser uma classe, poderia ser implementado em C sem classes, por exemplo. Não ficaria bonito e talvez até nem fosse muito funcional mas não vejo porque não poderia ser feito.

E sim, o conceito é um pouco o mesmo mas o problema é quando não se fala do conceito de "um conjunto de elementos indexados" mas sim de uma implementação. Ver um professor mostrar código que usa um array e depois ouvi-lo dizer "fazemos isto e aquilo àquele vector" é algo que me faz muita comichão no esfincter :P Não pela imprecisão em si mas pelo facto de ser algo que depois leva a confusões na cabeça de muita gente. Se não fosse por isto, provavelmente não me incomodava.

By Anónimo (not verified)
3 years 10 weeks ago

Muito bom

Infelizmente posso confirmar que a situação dos professores é verdade. Por outro lado e felizmente encontram-se na web excelentes explicações como esta. Obrigado está mesmo muito esclarecedor.

Continua com o bom trabalho :)

By borfast
3 years 10 weeks ago

Obrigado. :) Fico contente

Obrigado. :)

Fico contente por isto servir para ajudar outras pessoas.