2012-03-25 11 views
7

Como parte de una tarea, necesito concatenar ciertos valores en una matriz en C++. Así, por ejemplo si tengo:Concatene ints en una matriz?

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

que puede necesitar en algún momento para concatenar v [1] -> v [4] de modo que consiga un int con el valor 1234.

llegué funciona con stringstream, al agregar los valores en el stringstream y luego convertir de nuevo a un entero. Sin embargo, a lo largo del programa eventualmente habrá alrededor de 3 millones de permutaciones diferentes de v [] pasadas a mi función toInt(), y el flujo de cadenas parece bastante caro (al menos cuando se trata de muchos valores). está funcionando, pero es muy lento y estoy tratando de hacer todo lo que pueda para optimizarlo.

¿Hay una manera más óptima de concatenar ints en una matriz en C++? He hecho algunas búsquedas y casi en todas partes parece sugerir el uso de stringstream (que funciona, pero parece ralentizar mucho mi programa).

EDITAR: Solo aclarando, necesito el resultado para ser un int.

+2

Lo que se supone que sucede si uno de los enteros es mayor que 9? ¿O negativo? – Mat

+1

¿Qué significa "concatenar"? ¿Quieres cadenas o números? ¿Qué pasó con multiplicar por 10? –

+0

@Mat - los valores en la matriz son siempre entre 0 y 9. – Nate

Respuesta

5

pseudo código para una solución simple:

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

grandes matrices bombardearán a cabo debido al desbordamiento int tamaño.

+0

¿Quizás un flotador o doble sería mucho mejor? –

+0

Mis valores nunca superan los 5 dígitos en este programa, por lo que las entradas funcionan bien. Y esto es lo que acabo de implementar, ¡y funciona genial! Cortar mi tiempo de ejecución a la mitad. – Nate

3

¿Qué tal:

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

Si el número de elementos es variable en lugar de un número fijo, estoy seguro de que puede detectar un patrón aquí que se puede aplicar en un bucle.

+0

Gracias, eso es lo que necesitaba. ¡Lo probaré! – Nate

1

Todos son enteros. ¿No deberías hacer lo siguiente?

//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]; 

la salida sería un entero (no una cadena)

+0

Sí, necesito que la salida sea una int. ¡Gracias! – Nate

1

recordar los códigos ASCII?

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

Ah, eso tiene sentido, gracias. – Nate

+0

Vaya, en realidad, ahora que leo su publicación con más cuidado, me equivoco. Pensé que querías una cadena. Consulte a otros por la respuesta correcta. –

+1

Creo que quieres decir '| 0x30', pero aún así, '+ '0'' sería más claro. – hvd

0

cosas que puede hacer:

  1. asegurarse de que se compila con -O3 (O optimización del compilador equivalente).
  2. ¿Usted mismo genera los valores en el vector? Si es así, intente cambiar la función toInt() para aceptar un tipo de puntero simple.
  3. Escribir la conversión a sí mismo (código del navegador: puede incluso no compilar - u obtener la idea sin embargo):

    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 Eso es muy C-ish. Es completamente peligroso devolver una cadena de estilo C asignada con 'new' en C++, porque es probable que la persona que llama se olvide de borrar la cadena, lo que hace una _realmente problemática pérdida de memoria cuando la función se llama millones de veces. – leftaroundabout

+0

@leftaroundabout: No sé por qué lo menospreciaste solo porque el código es C-ish. El que pregunta está preguntando cómo mejorar el rendimiento de una función muy simple. No escribiría una aplicación de esta manera, pero definitivamente usaré esto para una tarea. – nakiya

+0

Si fuera un simple y efectivo aumento del rendimiento, no lo hubiera rechazado. Pero su código se compilaría en nada más rápido que cualquier compilador decente de la variante mucho más segura _y más fácil_ con 'std :: vector' /' std :: string's. Cámbialo para usarlo, y voy a votar mejor. – leftaroundabout