Objective-C中C ++ STL容器“pair <t1,t2 =”“>”的等价物</t1,>

时间:2010-08-19 17:01:32

标签: iphone c++ objective-c stl std-pair

我是Objective-C的新手,所以请不要过多地评价我。我想知道:我可以在Objective-C中使用相当于C ++ STL对的容器吗?

我想构建一个包含与NSBool关联的NSInteger的数组。我知道我可以使用一个数组,每个条目都是一个带有单个键值的NSDictionary,但我发现它有点过分。

有什么想法吗?

感谢。

5 个答案:

答案 0 :(得分:16)

你可以编写自己的数据结构对象 - 对于这么简单的情况,它会非常简单:

@interface Pair : NSObject 
{
    NSInteger integer;
    BOOL      boolean;
}
@property (nonatomic, assign) integer;
@property (nonatomic, assign) boolean;
@end

一个匹配的实现,然后您将Pair个对象放入NSArray问题中。

答案 1 :(得分:7)

您可以在Objective-C ++中使用STL。您需要做的就是将.m文件的扩展名更改为.mm,我还建议您使用#import代替#include。这样你就可以使用你的STL容器了。

答案 2 :(得分:1)

使用匿名结构和结构文字,您可以执行类似

的操作
NSValue * v = [NSValue valueWithBytes:(struct {NSInteger i; bool b;}){i,b} objCType:(struct {NSInteger i; bool b;})];

然后阅读,

struct {NSInteger i; bool b;} foo;
[v getValue:&foo];

如果你为你的结构命名,它会更清晰。

答案 3 :(得分:0)

NSNumber上使用关联对象的Pair类别怎么样,类似下面的代码(未经测试,可能需要iOS4,因为我不确定何时引入相关对象)。

#import <objc/runtime.h>

@implementation NSNumber(Pair)

#define PAIR_KEY 'p'

- (NSNumber *) pairNumber:(NSNumber *)second
{
    char secondKey = PAIR_KEY;
    objc_setAssociatedObject(self, &secondKey, second, OBJC_ASSOCIATION_RETAIN);
    return self;
}

- (NSNumber *) pairedNumber
{
    char secondKey = PAIR_KEY;
    NSNumber *associatedObject = (NSNumber *)objc_getAssociatedObject(self, &secondKey);    
    return associatedObject;
}

@end

你会像这样使用它:

BOOL myBool = NO;

NSNumber *storedBool = [NSNumber numberWithBool:myBool];

[myOtherNumber pairNumber:storedBool];

要把它拿出来:

NSNumber *boolNumber = [myOtherNumber pairedNumber];

答案 4 :(得分:0)

另一种选择是(ab)使用单项NSDictionary存储该对-因为NSDictionary现在可以定义为强制键入“键”和“值”,并且还支持将字面量用作语法糖。缺点-该对只能容纳NSObjects(实例引用),而不能存储原始值。

示例如下:

typedef NSDictionary<NSString *, NSDate *> *Pair;

然后在您的代码中:

Pair myPair = @{@"my name": [NSDate date]};
Pair myOtherPair =  @{@"his name": [NSDate date]};
NSArray<Pair> *myArrayOfPairs = @[myPair, myOtherPair];

继续并打印结果:

NSLog(@"%@", myArrayOfPairs);

它看起来非常符合您的期望。

2019-03-18 16:08:21.740667+0200 TesterApp[23135:23269890] (
  {
    "my name" = "2019-03-18 14:08:21 +0000";
  },
  {
    "his name" = "2019-03-18 14:08:21 +0000";
  }
)

当您尝试从所谓的“对”中提取值时,会出现投资回收期。实际上,您必须从NSDictionary中挖掘该单个条目,而不是像往常一样通过其“键”来挖掘,而是假设只有一个条目,例如:

Pair somePair = myArrayOfPairs.lastObject;
NSString *name = somePair.allKeys.firstObject;
NSDate *date = somePair.allValues.firstObject;
NSLog(@"name: %@ date: %@", name, date);

最终产生:

name: his name date: Mon Mar 18 16:16:43 2019

我不特别推荐这种替代方法,但是它有其优点和好处。