Domanda

Posso check in C (++) se una matrice è tutto 0 (o false) senza l'iterazione / loop su ogni singolo valore e senza allocare una nuova matrice delle stesse dimensioni (ad uso memcmp)?

Sto abusando un array di Caccio ad avere grandi bitsets arbitrari in fase di esecuzione e fare un po 'su di esso bitflipping

È stato utile?

Soluzione

È possibile utilizzare la seguente condizione:

(myvector.end() == std::find(myvector.begin(), myvector.end(), true))

Ovviamente, internamente, questo loop su tutti i valori.

L'alternativa (che in realtà dovrebbe evitare il loop) è quello di ignorare tutte le funzioni di scrittura di accesso, e tenere traccia di se true è mai stato scritto per il vostro vettore.

Aggiorna

I commenti di Lie Ryan sotto descrive un metodo più robusto di fare questo, basato sullo stesso principio.

Altri suggerimenti

Se non è risolto, no. Come vi intenzione di realizzare questo? Si avrebbe bisogno di ispezionare ogni elemento per vedere se è 0 o no! memcmp, naturalmente, sarebbe anche controllare ogni elemento. Sarebbe solo molto più costoso in quanto si legge un altro array pure.

Naturalmente, è possibile early-out, non appena si preme a-0 non elemento.

L'unica opzione sarebbe quella di utilizzare SIMD (che tecnicamente ancora controlli ogni elemento, ma utilizzando un minor numero di istruzioni), ma in genere non lo fate in un array generico.

(Btw, la mia risposta presuppone che si dispone di un / array semplice statica C C ++. Se è possibile specificare che tipo di serie che hai, potremmo essere più precisi).

Se si sa che questo sta per essere un requisito, si potrebbe costruire una struttura di dati costituita da una matrice (possibilmente dinamica) e un conteggio o attualmente non-zero cellule. Ovviamente l'impostazione di celle deve essere estratta attraverso, ma che è naturale in c ++ con sovraccarico, ed è possibile utilizzare un tipo opaco in c.

Si supponga che si dispone di una serie di elementi N, è possibile fare un controllo po 'contro una serie di vettori di base.

Ad esempio, si dispone di un array di 15 elementi che si desidera testare.

È possibile verificare contro una matrice di 8 elementi di zero, una matrice 4 elementi zero, un 2-elemento dell'array zero e un 1-elemento array zero.

È sufficiente assegnare questi elementi, una volta dato che si conosce la dimensione massima di array che si desidera testare. Inoltre, il test può essere fatto in parallelo (e con montaggio intrinseca se necessario).

Ulteriore miglioramento in termini di allocazione di memoria può essere fatto con utilizzando solo una matrice 8-elemento rispetto a 4 elemento di matrice zero è semplicemente la prima metà del 8 elementi dell'array zero.

Si consiglia di utilizzare boost::dynamic_bitset invece . Esso ha un elemento none e molti altri std::bitset simili operazioni, ma la sua lunghezza può essere impostata in fase di esecuzione.

No, è possibile confrontare le matrici con memcmp, ma non si può confrontare un valore con un blocco di memoria.

Che cosa si può fare è utilizzare algoritmi in C ++, ma che coinvolge ancora un anello interno.

Non hai per scorrere l'intera cosa, basta smettere di loop sul primo valore diverso da zero.

Non riesco a pensare a un modo per controllare una serie di valori diversi da loro ogni controllo, a sua volta - si potrebbe giocare con il controllo della memoria di base come qualcosa di più grande di bool (diciamo __int64), ma l'allineamento è quindi un problema.

EDIT: Si potrebbe mantenere un conteggio separato di bit impostati, e controllare che è diverso da zero. Dovreste stare attenti a manutenzione di questo, in modo che l'impostazione un po 'insieme non ha ++, e così via.

Knittl,

Non si supponga di avere accesso a alcuni componenti hardware DMA fantasia sul computer di destinazione? A volte i supporti hardware DMA esattamente l'operazione si richiede, vale a dire "questa regione di memoria è tutto da zero?" Questo tipo di confronto con accelerazione hardware è una soluzione comune quando si tratta di grandi bit-buffer. Ad esempio, alcuni controller RAID utilizzano questo meccanismo per il controllo di parità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top