paulo1205
(usa Ubuntu)
Enviado em 14/01/2020 - 18:54h
A maneira mais segura e canônica de comparar dois vetores em qualquer linguagem de programação é comparar elemento a elemento. Qualquer coisa diferente disso requer hardware especializado ou computação e programação paralela, ou então não passa de uma notação simplificada que esconde a complexidade do algoritmo e/ou hardware (por exemplo, em C++ você tem os operadores
== e
!= podendo ser aplicados a elementos de tipos como
std::array e
std::vector , mas esses operadores vão acabar invocando, internamente, comparações individuais entre elementos em posições correspondentes em cada vetor/
array ).
Você não disse qual o tipo de cada elemento do seu vetor e da sua matriz. Se forem ambas de um mesmo tipo inteiro (
char ,
int ,
long etc.), você pode tentar se valer do fato de que as representações internas de valores desses tipos não possuem ambiguidades (i.e. não existem duas representações diferentes para o mesmo valor) e usar
memcmp () para comparar a tripa inteira de
bytes em cada um deles, como no exemplo abaixo.
#define COLUNAS 35
#define LINHAS 200
int vetor[COLUNAS], matriz[LINHAS][COLUNAS];
int compara(int *m[LINHAS][COLUNAS], int *v[COLUNAS]){
for(int l=0; l<LINHAS; ++l)
if(memcmp((*m)[l], *v, COLUNAS*sizeof **v)==0)
return l; // Achou linha idêntica ao vetor; retorna o índice dessa linha.
return -1; // Não achou linha igual; retorna índice inválido.
}
int main(void){
/* Popula o vetor e a matriz (não mostrado). */
if(compara(&matriz, &vetor)!=-1)
printf("Encontrada linha igual ao vetor.\n");
else
printf("Nenhuma linha é igual ao vetor.\n");
}
Uma possível vantagem de usar
memcmp () é que muitas implementações dessa função empregam instruções diretas do processador para fazer comparações entre blocos de memória (em processadores que possuem tais instruções, como é o caso dos nossos PCs). Entretanto, como já implicado acima, essa técnica não pode ser usada dessa forma com dados de tipos como
float ou
double , que podem ter mais de uma representação para o mesmo valor, ou com tipos de dados compostos.
Por outro lado, o uso de compiladores que embutem otimizadores (quase todos, hoje em dia) pode acabar reconhecendo um laço de comparação entre elementos consecutivos de dois
arrays , e conseguir otimizar essa operação de um modo melhor até do que se poderia conseguir ao se usar
memcmp manualmente. Faça testes.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)