2010-08-23 19 views
19

Ciao ho un programma che si occupa molto con i vettori e gli indici degli elementi di questi vettori, e mi chiedevo:C++ uint, unsigned int, int

  1. c'è una differenza tra il uint e unsigned int
  2. che è meglio usare uno dei tipi sopra o semplicemente usare int mentre leggo alcune persone dicono che il compilatore gestisce i valori int in modo più efficiente, ma se ho usato int dovrò controllare sempre gli idx negativi che è il dolore.
  3. pensi che gli iteratori siano migliori? è più efficiente della normale indicizzazione vectorx[idx]?

P.S il software gestire grandi gestisce dati e buone prestazioni è un deve avere requisito

risposta

29
  1. C++ definisce tale tipo uint. Questo deve essere il "tuo" tipo, cioè un tipo definito nel tuo codice o in una libreria di terze parti. Si può supporre che sia lo stesso di unsigned int. Potrebbe essere unsigned long int o qualcos'altro. Ad ogni modo, devi controllarlo da solo.

  2. È una questione di stile personale. Per esempio, io credo che si debbano usare tipi non firmati per rappresentare valori naturalmente non negativi, come dimensioni o quantità. Non c'è differenza di prestazioni tra tipi firmati e non firmati, a parte alcuni contesti specifici. Direi che nella maggior parte dei casi è senza firma tipi che verranno gestiti in modo più efficiente.

  3. Gli iteratori rendono le implementazioni più generiche, ovvero è possibile utilizzare l'iteratore ad accesso sequenziale e rendere quindi l'implementazione applicabile a qualsiasi struttura di dati sequenziale. Utilizzando l'indice imponi il requisito di accesso casuale sulla struttura dei dati, che è un requisito importante. Non è una buona idea imporre requisiti forti quando non ce n'è bisogno.

+1

@AndreyT: Io non mangio ma sto usando netbeans, compilatore GCC, e ho già fatto il codice con uint e funziona senza librerie. I 2 e 3 punti sono molto istruttivi, grazie mille :) –

+14

'uint' è typedef'd come una scorciatoia per' unsigned int' dalla maggior parte dei compilatori. – You

+2

In ogni caso, non cambia il fatto che non esiste un tipo come "uint" né in C né in C++, quindi a meno che non venga considerato un compilatore specifico, la domanda su "uint" non ha una risposta significativa. – AnT

3

Se si esegue il looping del vettore in sequenza, con tutti i mezzi, utilizzare l'iteratore. C'è un sovraccarico legato all'indicizzazione, indipendentemente dal tipo di indice, che può essere evitato iterando.

1

1) uint = unsigned int, infatti uint è solo un typedef per unsigned int (sarà sostituito da unsigned int in fase di compilazione).

2) Se vuoi aggiungere al tuo codice un po 'di "sicurezza" con uint, eviterai di sicuro valori negativi.

3) Se si scorre il vettore in sequenza, andare con iteratori, sono ottimizzati per il ciclo sequenziale (sono una sorta di puntatori).

+2

Non male per un downvote, ma 'uint' di solito sarà un' typedef', non una macro, e firmato contro unsigned ha poco a che fare con la sicurezza (se mai può causare problemi di sicurezza, dato che l'aritmetica non firmata funziona diversamente da molti i programmatori si aspettano!) –

+0

Hai ragione per typedef (lo modifico) Per sicurezza, intendo un sentimento di sicurezza per il programmatore, niente di relativo al compilatore, ecco perché ho messo il "" – Arslan

0

Come altro poster hanno notato, uint è probabilmente un typedef per unsigned int Se si sta utilizzando Visual Studio , è possibile verificare che infatti molto rapidamente premendo F12 mentre il cursore di testo è in uint per vedere la sua definizione .