Delphi XE2:如何使用序数> 255的整数集

乔治·德拉马特

我要做的就是定义一组整数,这些整数的值可能会超过255,但是我看不到任何好的选择。例如:

with MyObject do Visible := Tag in [100, 155, 200..225, 240]; // Works just fine

with MyObject do Visible := Tag in [100, 201..212, 314, 820, 7006]; // Compiler error

我已经习惯了(通常冗长)条件语句,例如:

with MyObject do Visible := (Tag in [100, 202..212]) or (Tag = 314) or (Tag = 820) or (Tag = 7006);

但这似乎很荒谬,这只是一个硬编码的示例。如果我想编写一个过程并传递一组整数,其值可能大于255,该怎么办?有一种更好,更简洁的方法可以做到这一点。

安德烈亚斯·瑞布兰德(Andreas Rejbrand)

Delphi集的基本类型必须是具有最多256个不同值的序数类型。在后台,这样的变量每个可能的值都有一个位,因此类型变量的set of Byte大小为256位= 32字节。

假设有可能创建类型为的变量set of Integer有2 32 = 4294967296个不同的整数值,因此此变量必须具有4294967296位。因此,它的大小为512 MB。那是一个巨大的变量。也许您可以在100年后将这样的值放在堆栈上。

因此,如果您确实需要使用(数学)整数集,则需要自定义数据结构。内置集合类型将不起作用。例如,您可以将其实现为高级记录。然后,您甚至可以使in运算符过载,使其看起来像真正的Pascal集!

实现缓慢而效率低下的这种类型是微不足道的,对于小型集合而言可能已经足够了。用有效的操作(成员资格测试,子集测试,交集,并集等)实现通用整数集数据结构的工作量更大。在WWW上可能有第三方代码可用(但是Stack Overflow并不是推荐库的地方)。

如果您的需求较为适中,则可以使用简单的整数数组来代替(TArray<Integer>)。也许您不需要O(1)成员资格测试,子集测试,交集和并集?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章