2010-02-22 13 views
7

¿Se puede usar un valor flotante como índice de una matriz? ¿Qué pasará si una expresión utilizada como índice resultara en un valor flotante?Valores flotantes como índice en una matriz en C++

+2

¿Suena como tarea? –

+0

Una muy mala idea debido a errores de redondeo. Sin embargo, a veces esto es útil, pero luego el valor debe convertirse en entero primero y la comprobación de límites (o la limitación) debe hacerse antes de acceder. Esta operación puede ser útil, p. para aproximar valores para una función de coma flotante usando una tabla de búsqueda. – Tronic

Respuesta

10

El valor flotante se debe enyesar a int (que puede dar aviso o de error dependiendo del nivel de advertencia de compilador)

s1 = q[12.2]; // same as q[12] 
s2 = q[12.999999]; // same as q[12] 
s3 = q[12.1/6.2]; // same as q[1] 
9

Sí. Pero no tiene sentido. El valor flotante se truncará en un entero.

(Puede utilizar std::map<float, T>, sin embargo, pero la mayor parte del tiempo que va a perder los valores destinados a causa de la inexactitud.)

+1

+1 for 'std :: map' –

+1

En cuanto a la inexactitud, creo que debería haber alguna forma de proporcionar su propia función de comparación, donde puede incluir un 'épsilon' ... una especie de tolerancia. –

+0

@Agnel Kurian std :: mapa, por supuesto, le permite exactamente esto –

1

Será fundido a int.

2

Una matriz C++ es una secuencia contigua de ubicaciones de memoria. a[x] significa "la ubicación de la memoria xth después de uno apuntado por a."

¿Qué significaría acceder al objeto 12.4 en una secuencia?

+0

Nota para pedantes: sí, sé que las compensaciones de matriz no son una simple adición de enteros a punteros: esta oración asume que una "ubicación de memoria" es del tamaño de un miembro de matriz, por lo que para una int a [], a [5] significa la quinta palabra, no el quinto byte. – Crashworks

0

Esto es un error. En [expr.sub]:

Una expresión de post fi x seguida de una expresión entre corchetes es una expresión de correos fijos. Una de las expresiones tendrá el tipo "puntero a T" y la otra tendrá enumeración sin ámbito o tipo integral.

No estoy al tanto de una cláusula en la norma que especifica que la conversión debe ocurrir aquí (la verdad, no me sorprendería si existía una cláusula de este tipo), aunque las pruebas con ideone.com produjo un error de compilación.

Sin embargo, si está suscribiendo una clase en lugar de un puntero — p. std::vector o std::array — entonces la sobrecarga de operator[] tendrá la semántica habitual de una llamada a función, y los argumentos de punto flotante se convertirán a la size_type correspondiente.

Cuestiones relacionadas