在我推出我自己的隊列使用NSMutableArray
之前,我想知道是否有更多的標準可用。我沒有看到Apple文檔中的任何內容,但如果沒有人們正在使用的Queue實現,我會感到驚訝。 Java破壞我!是否有iPhone的隊列/ FIFO數據結構?
8
A
回答
10
基於NSMutableArray
實現隊列很容易,它可能在50行以下的代碼。
編輯:
了快速谷歌搜索發現這一點:
@interface Queue:NSObject {
NSMutableArray* objects;
}
- (void)addObject:(id)object;
- (id)takeObject;
@end
@implementation Queue
- (id)init {
if ((self = [super init])) {
objects = [[NSMutableArray alloc] init];
}
return self;
}
- (void)dealloc {
[objects release];
[super dealloc];
}
- (void)addObject:(id)object {
[objects addObject:object];
}
- (id)takeObject {
id object = nil;
if ([objects count] > 0) {
object = [[[objects objectAtIndex:0] retain] autorelease];
[objects removeObjectAtIndex:0];
}
return object;
}
@end
5
可可本身不具有Queue類,而且也沒有一個標準本身,而是有多種選擇,一個其中最適合您的需求。見this question(和my answer)。
就像你說的,你可以使用NSMutableArray推出自己的。如果你只需要一個quick'n'dirty隊列(並不擔心複製,編碼/解碼,枚舉等),那麼@Matt的解決方案是一個簡單的方法。你還應該考慮adding queue methods to NSMutableArray
via a category,這很好,因爲你的「隊列」也是一個數組(所以你可以將它傳遞給NSArray參數),並且你可以免費獲得所有NS(可變)數組的功能。
如果性能很重要,我推薦使用更適合去除第一個元素的結構。出於這個原因,我爲自己的框架寫了CHCircularBufferQueue。 (不要試圖自吹自擂,只是爲了節省一些時間。)
1
我已經根據馬特橋代碼製作了一個只包含deque方法的類。
@interface NSMutableArray (ShiftExtension)
// returns the first element of self and removes it
-(id)shift;
@end
@implementation NSMutableArray (ShiftExtension)
-(id)shift {
if([self count] < 1) return nil;
id obj = [[[self objectAtIndex:0] retain] autorelease];
[self removeObjectAtIndex:0];
return obj;
}
@end
0
您可以使用C++標準庫中的STL隊列。
0
查看STL priority queue。它需要零線代碼,並且是便攜式的!你還能想要什麼?
0
你可以使用:NSArray的lastObject方法。下面是一個未經測試的例子:
Queue.h
#import <Foundation/Foundation.h>
@interface Queue : NSObject
-(void)enqueue:(id)object;
-(id)dequeue;
@end
Queue.m
#import "Queue.h"
@interface Queue()
@property(nonatomic, strong) NSMutableArray *backingArray;
@end
@implementation Queue
-(id)init {
self = [super init];
if (self) {
self.backingArray = [NSMutableArray array];
}
return self;
}
-(void)enqueue:(id<NSObject>)object {
[self.backingArray addObject:object];
}
-(id)dequeue {
id object = [self.backingArray lastObject];
[self.backingArray removeObject:object];
return object;
}
@end
相關問題
- 1. 這是否類似隊列數據結構有名字嗎?
- 2. 是否有這樣一個結合隊列和散列表的數據結構?
- 3. 數據結構 - 隊列
- 4. 在數據結構隊列中出隊?
- 5. '優先級隊列'數據結構是否符合SET理論?
- 6. 棧和隊列是線性數據結構還是非線性數據結構?
- 7. 核心數據是否有FIFO?
- 8. 結構與FIFO
- 9. FIFO隊列同步
- 10. Amazon Sqs FIFO隊列
- 11. Ruby標準庫中是否有優先級隊列數據結構實現?
- 12. 是否有FIFO隊列根據某些條件提供唯一性
- 13. [數據結構]:循環隊列
- 14. 數據結構:循環隊列(在C)
- 15. 在數據結構中實現隊列
- 16. 數據結構隊列混淆
- 17. 優先級隊列數據結構
- 18. 持久性隊列數據結構
- 19. 結構隊列
- 20. Firebase中的FIFO隊列
- 21. java是否有「LinkedConcurrentHashMap」數據結構?
- 22. R是否有Set數據結構?
- 23. PHP是否有Set數據結構?
- 24. PriorityQueue是一個FIFO隊列嗎?
- 25. 什麼是數據結構中的內存隊列?
- 26. 是否有行和列交換的高效數據結構?
- 27. 打印隊列中的所有值(數據結構)?
- 28. FIFO隊列鏈表實現
- 29. 原型JavaScript Ajax FIFO隊列
- 30. Java FIFO隊列實現
1我清理代碼格式一點點,並且-takeObject方法。 – 2009-07-10 18:04:43
在你的dealloc上添加一個[objects release]我會給你一個+1 – slf 2010-06-12 18:26:58