Objective-C稀疏数组redux

时间:2011-09-22 02:29:19

标签: iphone objective-c ios

首先,我看过this,但它似乎并不适合我的需要。

我遇到了需要稀疏数组的情况。我可以拥有的一些情况,例如3000个可能的条目,只有20个分配,其他情况下我可以分配大部分或全部3000。使用NSMutableDictionary(使用整数索引值的NSString表示)似乎适用于第一种情况,但对于第二种情况,在存储和查找速度方面看起来效率都很低。对于空条目使用带有NSNull对象的NSMutableArray对于第二种情况可以很好地工作,但是对于第一种情况插入大多数3000 NSNull条目似乎有点浪费(并且它可能在UI处产生恼人的延迟)。 / p>

引用的文章提到使用NSMapTable,因为它应该允许整数键,但显然该类在iPhone上不可用(我不确定我是否喜欢有一个不保留的对象)。

那么,还有其他选择吗?

已添加9/22

我一直在寻找一个嵌入NSMutableSet的自定义类,其中的set条目由一个带有整数(即元素#)的自定义类和元素指针组成,并根据adds / updates /编写模仿NSMutableArray发现(但不是插入/删除)。这似乎是最合理的方法。

4 个答案:

答案 0 :(得分:1)

NSMutableDictionary可能不会很慢,字典通常使用散列并且相当快,基准。

另一个选项是C指针数组。分配大型数组只分配虚拟内存,直到访问实际内存(固化calloc,而不是malloc,memset)。缺点是内存分配在4KB页面中,这可能会浪费少量条目,因为大量条目可能会落入同一页面。

答案 1 :(得分:0)

CFDictionary(或实际CFMutableDictionary)怎么样?在文档中,它说你可以使用任何C数据类型作为键,所以也许这更接近你需要的东西?

答案 2 :(得分:0)

我已经完成了自定义课程,到目前为止效果非常好。这是h + m文件中的322行代码,包括内部类的东西,很多空白行,注释,description格式化程序(目前给我的麻烦比其他任何东西都要多)和一些与之无关的LRU管理代码基本概念。性能方面似乎比我的另一个方案工作得更快,只允许尾端“稀疏”,大概是因为我能够消除很多特殊情况逻辑。

这种方法的一个好处是我可以使大部分API与NSMutableArray相同,所以我只需要改变25%的某些行以某种方式引用该类。

答案 3 :(得分:0)

我还需要一个稀疏阵列,并把我放在git hub上。 如果您需要稀疏数组,请随时抓取https://github.com/LavaSlider/DSSparseArray