Per i tipi di dati primitivi (non struct), se si conosce la dimensione della matrice e ciò che si sta cercando di confrontare con: memcmp
farà il lavoro:
#include <stdio.h>
#include <string.h>
static int allOnes[6] = {1,1,1,1,1,1};
int main(int argc, const char* argv[]) {
int isUsed[6] = {1,1,1,1,1,1};
if(memcmp(isUsed, allOnes, sizeof allOnes) == 0)
printf("Array has only 1's\n");
else
printf("At least one element is not 1\n");
}
EDIT: sulle prestazioni ...
Alcuni commenti menzionano le prestazioni di memcmp
e loop, inclusi i loop srotolati.
Di seguito è riportato un semplice programma di test per misurare le prestazioni. Nella mia macchina (Mac OS X, LLVM compilatore), questo è quello che ottengo:
memcmp: 0.036031 seconds result=1
loop: 0.097180 seconds result=1
unrolled loop: 0.075623 seconds result=1
Prima di fare commenti specifici sui numeri di cui sopra, si ricorda che:
- non sto facendo un affermazione generica, solo mostrando che nel mio ambiente la soluzione
memcmp
batte gli altri con un ampio margine.
- il ciclo di srotolamento che ho non è la massima implementazione. È solo un tentativo grossolano di avere un numero per lo svolgimento del ciclo sul posto.
Sentitevi liberi di rielaborare il codice e inviare altri numeri.
#include <stdio.h>
#include <string.h>
#include <time.h>
static int allOnes[6] = {1,1,1,1,1,1};
bool compareWithMemcmp()
{
int isUsed[6] = {1,1,1,1,1,1};
return memcmp(isUsed, allOnes, sizeof allOnes) == 0;
}
bool compareWithLoop()
{
int isUsed[6] = {1,1,1,1,1,1};
for(int i = 0; i < sizeof allOnes/sizeof allOnes[0]; i++)
if(isUsed[i] != 1)
return false;
return true;
}
bool compareWithUnrolledLoop()
{
int isUsed[6] = {1,1,1,1,1,1};
// IMPORTANT: doesn't account for odd-length array
for(int i = 0; i < sizeof allOnes/sizeof allOnes[0]; i += 2)
if((isUsed[i] != 1) || (isUsed[i+1] != 1))
return false;
return true;
}
int main(int argc, const char* argv[]) {
bool result;
clock_t begin = clock();
for(int i = 0; i < 10000000; i++)
result = compareWithMemcmp();
printf("memcmp: %f seconds result=%d\n",
(double)(clock() - begin)/CLOCKS_PER_SEC, result);
begin = clock();
for(int i = 0; i < 10000000; i++)
result = compareWithLoop();
printf("loop: %f seconds result=%d\n",
(double)(clock() - begin)/CLOCKS_PER_SEC, result);
begin = clock();
for(int i = 0; i < 10000000; i++)
result = compareWithUnrolledLoop();
printf("unrolled loop: %f seconds result=%d\n",
(double)(clock() - begin)/CLOCKS_PER_SEC, result);
}
La risposta è NO. Non possibile senza accedere a ciascun elemento. –
Perché non sei soddisfatto del modo in cui sai che esista, cioè esegui il ciclo dell'array e confronti gli elementi uno per uno? Pensi che non sia ottimale? Se è così, perché? –
sì, penso che sia meglio se abbiamo un metodo di libreria c – user2131316