C++中将浮点数作为数组索引

8

浮点数值能否用作数组的索引?如果将表达式用作索引导致浮点数值,会发生什么?


这是一个非常糟糕的想法,因为存在舍入误差。然而,有时候这是有用的,但是在访问之前应该先将值转换为整数并进行边界检查(或限制)。例如,使用查找表近似浮点函数的值时,此操作可能很有用。 - Tronic
5个回答

12

浮点数值将被转换为整数(这可能会根据编译器的警告级别而产生警告或错误)。

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]

11

可以,但是没有意义。浮点数的值将被截断为整数。

(但是你可以使用std::map<float, T>,不过大部分时间会因为精度问题错过预期的值。)


1
关于不准确性,我认为应该有一些方法来提供自己的比较函数,在其中可以包含一个“epsilon”...一种容忍度。 - Agnel Kurian
当然,如果顺序不重要,您也可以使用unordered_map来提高性能。在这种情况下,您必须在哈希函数中包含epsilon。 - akaltar

2

C++数组是一系列连续的内存位置。a[x]表示“在a指向的内存位置之后第x个内存位置”。

要访问序列中的第12.4个对象意味着什么?


注:对于专业人士,我知道数组偏移不仅仅是整数加指针:此句假设“内存位置”大小为数组成员的大小,因此对于int a[],a[5]表示第五个字而非第五个字节。 - Crashworks

1

它将被转换为整数。


0

这是一个错误。在[expr.sub]中:

方括号内跟随着后缀表达式是一个后缀表达式。其中一个表达式应该具有“指向T的指针”类型,另一个应该具有未作用域枚举或整数类型。

我不知道标准中是否有规定转换应该发生在这里(尽管如果存在这样的条款,我也不会感到惊讶),但是使用ideone.com进行测试确实会产生编译错误。

然而,如果您对类进行下标操作而不是指针 - 例如std::vectorstd::array - 那么operator[]的重载将具有函数调用的通常语义,并且浮点参数将转换为相应的size_type


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接