2012-03-25 13 views
7

Come parte di un compito a casa ho bisogno di concatenare determinati valori in un array in C++. Così, per esempio se ho:Concatena gli interi in un array?

int v[] = {0,1,2,3,4} 

Potrei aver bisogno ad un certo punto per concatenare v [1] -> v [4] in modo che ottengo un intero con il valore 1234.

ho ottenuto funziona usando stringstream, aggiungendo i valori allo stringstream e quindi riconvertendolo in un numero intero. Tuttavia, in tutto il programma ci saranno circa 3 milioni di permutazioni di v [] passate alla mia funzione toInt(), e lo stringstream sembra piuttosto costoso (almeno quando si tratta di molti valori). funziona, ma molto lentamente e sto cercando di fare tutto il possibile per ottimizzarlo.

Esiste un modo più ottimale per concatenare ints in un array in C++? Ho fatto qualche ricerca e quasi ovunque sembra suggerire semplicemente l'utilizzo di stringstream (che funziona, ma sembra rallentare molto il mio programma).

EDIT: Basta chiarire, io ho bisogno che il risultato sia un int.

+2

quello che dovrebbe accadere se una delle int è maggiore di 9? O negativo? – Mat

+1

Che cosa significa "concatenare"? Vuoi stringhe o numeri? Cosa è successo a moltiplicare per 10? –

+0

@Mat - i valori nell'array sono sempre compresi tra 0 e 9. – Nate

risposta

5

Pseudo codice per una soluzione semplice:

int result = 0; 
for (int i=0; i < len(v); i++) 
{ 
    result = result*10 + v[i]; 
} 

grandi array saranno bombardare fuori a causa delle dimensioni troppo pieno int.

+0

Forse un galleggiante o doppio sarebbe più giusto? –

+0

I miei valori non diventano mai più grandi di 5 cifre in questo programma, quindi gli interi funzionano correttamente. E questo è quello che ho appena realizzato e funziona alla grande! Taglia il mio tempo di esecuzione a metà. – Nate

3

ne dite:

int result = (((v[1])*10+v[2])*10+v[3])*10+v[4]; 

Se il numero di elementi è variabile piuttosto che un numero fisso, sono sicuro che è possibile individuare un modello qui che può essere applicato in un ciclo.

+0

Grazie, è quello di cui avevo bisogno. Lo proverò! – Nate

1

Tutti sono numeri interi. Non dovresti fare quanto segue.

//if you want to concatenate v[1] and v[4] 
int concatenated; 
concatenated = v[1]*10+v[4]; 
//If you want to concatenate all 
concatenated = 0; 
for(int i=1;i<=4;i++) 
    concatenated = concatenated*10+v[i]; 

l'output sarà un numero intero (non una stringa)

+0

Sì, ho bisogno che l'output sia int. Grazie! – Nate

1

ricordare i codici ASCII?

char concat[vSize+1]; 
concat[vSize] = 0; 
for(int i = 0; i < vSize; i++) { 
    concat[i] = (v[i] % 10) & 0x30; 
} 
+0

Ah, questo ha senso, grazie. – Nate

+0

Oops, in realtà, ora che ho letto più attentamente il tuo post, ho sbagliato. Pensavo volessi una stringa. Fare riferimento ad altri per la risposta corretta. –

+1

Penso tu voglia dire '| 0x30', ma ancora, '+ '0'' sarebbe più chiaro. – hvd

0

cose che si possono fare:

  1. fare in modo che si compila con -O3 (o di ottimizzazione del compilatore equivalente).
  2. Generi tu stesso i valori nel vettore? Se è così, prova a cambiare la funzione toInt() per accettare un semplice tipo di puntatore.
  3. Scrivi la conversione da soli (il codice del browser: non può anche compilare - u avere l'idea però):

    char* toInt(int* values, size_t length) 
    { 
        int *end = values + sizeof(int)*length; 
        int *cur = values; 
    
        char* buf = new char[length + 1] 
    
        for(char* out = buf;cur < end;++cur, ++buf) 
        { 
         *out = (char)*cur + '0'; 
        } 
        *buf = '\0'; 
        return buf; 
    } 
    
+0

-1 Questo è molto C-ish. È assolutamente pericoloso restituire una stringa in stile C allocata con 'new' in C++, perché è probabile che il chiamante dimentichi di cancellare la stringa, il che rende una perdita di memoria _really_ problematica quando la funzione viene chiamata milioni di volte. – leftaroundabout

+0

@leftaroundabout: Non so perché lo avresti downvotato solo perché il codice è C-ish. L'interrogante sta chiedendo come migliorare le prestazioni di una funzione molto semplice. Non scriverò un'applicazione in questo modo ma per un lavoro a casa userò sicuramente questo. – nakiya

+0

Se fosse un semplice ed efficace aumento di prestazioni, non l'avrei downvoted. Ma il tuo codice non compilerebbe niente più veloce di quello che qualsiasi compilatore decente farebbe della variante molto più facile e più sicura con 'std :: vector' /' std :: string's. Cambialo per usarli e io inviterò. – leftaroundabout