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

2024-04-06

我想做的就是定义一组值可能高于 255 的整数,但我没有看到任何好的选择。例如:

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

but

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 的整数,该怎么办?必须有一种更好、更简洁的方法来做到这一点。


a 的基本类型德尔福套装 http://docwiki.embarcadero.com/RADStudio/en/Structured_Types_(Delphi)#Sets必须是序数类型at most256 个不同的值。在引擎盖下 http://docwiki.embarcadero.com/RADStudio/en/Internal_Data_Formats_(Delphi)#Set_Types,这样的变量对于每个可能的值都有一位,因此类型的变量set of Byte大小为 256 位 = 32 字节。

Suppose it were possible to create a variable of type set of Integer. There would be 232 = 4294967296 distinct integer values, so this variable must have 4294967296 bits. Hence, it would be of size 512 MB. That's a HUGE variable. Maybe you can put such a value on the stack in 100 years.

因此,如果您确实需要使用(数学)整数集,则需要自定义数据结构;内置的set类型不行。例如,您可以将其实现为高级记录。然后你甚至可以超载in操作员 http://docwiki.embarcadero.com/RADStudio/en/Operator_Overloading_(Delphi)让它看起来像一个真正的帕斯卡集!

实现这样一个缓慢且低效的类型是微不足道的,这对于小型集合来说可能已经足够了。实现具有高效操作(成员测试、子集测试、交集、并集等)的通用整数集数据结构需要更多工作。 WWW 上可能有可用的第三方代码(但 StackOverflow 不是库推荐的地方)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi XE2:如何使用序数值 > 255 的整数集 的相关文章

随机推荐