我需要做的是打开一个0和1的文本文件,以查找文件中列之间的模式。
所以我的第一个想法是将每一列解析为一大堆bool,然后在列之间进行逻辑(现在在数组中)。直到我发现bool的大小实际上是一个字节而不是一点,所以我会浪费1/8的内存,将每个值分配给一个bool。
它是否与800x800值的网格相关?处理这个问题的最佳方法是什么? 如果它是一个复杂的答案,我会很感激代码片段
答案 0 :(得分:4)
你可以使用std::vector<bool>
这是一个向量的特化,它使用一个紧凑的商店用于布尔...... 1位而不是8位。
答案 1 :(得分:4)
您可以使用std::bitset或Boosts dynamic_bitset,这些方法可以帮助您管理比特。
例如,它们支持从其他默认类型(如int或char)创建位集的构造函数。您还可以将bitset导出为ulong或字符串(然后可以将其再次转换为bitset等)
我曾经问过关于连接这些的问题,而这些关系并不是很有可能。但也许您可以使用question中的信息。
答案 2 :(得分:2)
我认为是Knuth说过早优化是所有邪恶的根源。让我们更多地了解这个问题。你的阵列是800 ** 2 == 640,000字节,这对于比数字手表更强大的东西来说没什么大不了的。
虽然将它存储为字节可能看起来很浪费 - 正如你所说,7/8的内存是冗余的 - 但另一方面,大多数机器不像字节那样有效地执行位操作;通过保存内存,您可能会浪费太多精力进行屏蔽和测试,使用字节模型会更好。
另一方面,如果你想要用它来寻找更大的模式,你可能想要使用按位表示,因为你可以一次做8位的事情。
这里的真正要点是有几种可能性,但没有人能够在不知道问题的情况下告诉你“正确”的表示。
答案 3 :(得分:1)
对于那个大小的网格,你的bool数组大约是640KB。如果这将是一个问题,取决于你有多少内存。它可能是逻辑分析代码最简单的。
通过对这些位进行分组并存储在int数组中,您可以将内存需求降低到80KB,但逻辑代码会更复杂,因为您总是要隔离要检查的位。