gpt4 book ai didi

objective-c - 在 Objective-C 中存储和检索数字对的快速方法

转载 作者:可可西里 更新时间:2023-11-01 05:57:49 25 4
gpt4 key购买 nike

我正在实现队列洪水填充算法,需要在 NSMutableArray 中存储和检索数字对。

基本上,我正在创建一个数组

m_queue = [NSMutableArray array];

然后在某个时候填充数组

[m_queue addObject:[NSValue valueWithCGPoint:CGPointMake(x + 1, y)]];

然后我为下一次迭代检索数据并删除数组开头的值

NSValue* value = [m_queue objectAtIndex:0];
[m_queue removeObjectAtIndex:0];
CGPoint nextPoint = [value CGPointValue];

[self queueFloodFill8:nextPoint.x y:nextPoint.y];

问题是:我该怎么做才能避免创建大量的 CGPointNSValue 对象?

我真的不需要点,算法使用成对的整数值,所以我认为可能有更好的方法来存储这样的成对。

更新:我研究了实现 C 风格的解决方案,例如 @mattjgalloway 和 @CRD 建议的。

我介绍过

typedef struct lookup_point_struct
{
int x;
int y;
struct lookup_point_struct* next;
} LookupPoint;

并重写代码以使用此类结构的链表代替 NSMutableArrayCGPoint/NSValue

所有这些使我的代码快了大约 3 倍。内存消耗也显着下降。

最佳答案

除了创建您自己的类(例如 NumberPair 或您放入数组而不是使用 NSValueCGPoint。这样做可能会稍微提高内存效率,并且您可以使 NumberPair 包含两个整数而不是像您担心的 float 。像这样的东西:

@interface NumberPair : NSObject
@property (nonatomic, assign) int x;
@property (nonatomic, assign) int y;
@end

@implementation NumberPair
@synthesize x, y;
@end

...

m_queue = [NSMutableArray array];

NumberPair *newPair = [[NumberPair alloc] init];
newPair.x = 1;
newPair.y = 2;
[m_queue addObject:newPair];

...

NumberPair *nextPoint = [m_queue objectAtIndex:0];
[m_queue removeObjectAtIndex:0];
[self queueFloodFill8:nextPoint.x y:nextPoint.y];

除此之外,你可以做一个更像 C 的事情,让 struct 包含两个整数,创建一个动态分配的数组来存储结构(你需要知道的最大大小队列或继续重新分配)。像这样的东西:

typedef struct {
int x;
int y;
} NumberPair;

NumberPair *m_queue = (NumberPair*)malloc(sizeof(NumberPair) * QUEUE_SIZE);
// ... etc

此外,您可能想查看我的 MJGStack类,它包装 NSMutableArray 以提供类似堆栈的接口(interface),您可以稍微调整它来执行您想要的操作,而不是直接使用 NSMutableArray。尽管这无论如何都不是必需的。

关于objective-c - 在 Objective-C 中存储和检索数字对的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com