Objective-C Как я могу использовать вектор-пару? - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в Objective-C, и мне нужно манипулировать кодом так же, как в коде C ++.

typedef long long ll;
vector< pair<ll, int> > v;
for(int i = 0; i < N; i++){
   v.push_back( make_pair(token[i], N - i));
}
sort(v.begin(), v.end());

Мне нужно использовать тот же код в Objective-C без потери объектно-ориентированного.

Вот я попробовал Objective-C

#import <Foundation/Foundation.h>

typedef long long ll;


@interface Main:NSObject
-(void) main;
@end

@implementation Main

-(void) main{

    struct Pair{
        ll first;
        int second;
    };

    NSMutableArray *v = [NSMutableArray new];
    int N = 3;
    NSMutableArray *vector = [NSMutableArray arrayWithCapacity:(int)N];

    int i;
    for(i=0;i<N;i++){

        ll value = (ll)i;
        printf("Value is: %lld",(ll)i);
        [vector addObject:[NSNumber numberWithLongLong:(value)]];
    }

    for(int i = 0; i < N; i++){

        struct Pair *p = malloc(sizeof(struct Pair));;
        ll firstValue = [[vector objectAtIndex:i] longLongValue];

        NSLog(@"\nFirst Value is: %lld",firstValue);

        p->first = firstValue;
        p->second =  (int)N - i;

        NSLog(@"\n\nAfter append it to P:%lld and Int is: %d \n\n",p->first,p->second);

        NSValue *value = [NSValue valueWithBytes:p objCType:@encode(struct Pair)];

        [v addObject:value];
    }


    [v sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

        struct Pair *first = (__bridge struct Pair *)obj1;
        struct Pair *second = (__bridge struct Pair *)obj2;

        NSLog(@"%lld %d",first->first,first->second);

        return first->first < second->second;
    }];

    for(int i = 0;  i < N; i++){

        //I need to print first and second from V
    }
}
@end


int main() {
    @autoreleasepool {

        Main *main = [[Main alloc]init];
        [main main];
    }
    return 0;
}

Проблема:

Я добился успеха NSLog(@"\n\nAfter append it to P:%lld and Int is: %d \n\n",p->first,p->second); Но я не могу вернуть то же значениес v здесь NSLog(@"%lld %d",first->first,first->second);.

Итак, как мне вставить обратно struct из v?

Решает ли этот код C ++ для Objective - C простым способом вместо этого?

Выход для вышеуказанного кода Objective-C:

Значение: 0 Значение: 1 Значение: 2

Первое значение: 0

После добавления к P: 0 и Int: 3 Первое значение: 1

После добавления к P: 1 и Int: 2 Первое значение: 2

Последобавьте его к P: 2 и введите Int: 1

80501841873530129 0

80501841873530129 0

1 Ответ

0 голосов
/ 27 мая 2018
  1. Вы используете значение с байтами для создания NSValue из указателя.

  2. Вы сортируете NSValue, но приводите их через мост как Pair * ..

  3. Вы выделяете в куче через malloc, что не является необходимым, если вы хотите, чтобы код был точно таким же, как версия C ++ (каждый Pair хранится в векторев качестве копии .. не указатель).

Если вы хотите использовать указатели (для необработанной памяти), то:

#import <Foundation/Foundation.h>

typedef long long ll;

@interface Main:NSObject
-(void) main;
@end

@implementation Main

-(void) main{

    struct Pair {
        ll first;
        int second;
    };

    NSMutableArray *v = [NSMutableArray new];
    int N = 3;
    NSMutableArray *vector = [NSMutableArray arrayWithCapacity:(int)N];

    int i;
    for(i=0;i<N;i++){

        ll value = (ll)i;
        printf("Value is: %lld",(ll)i);
        [vector addObject:[NSNumber numberWithLongLong:(value)]];
    }

    for(int i = 0; i < N; i++){

        struct Pair *p = malloc(sizeof(struct Pair));
        ll firstValue = [[vector objectAtIndex:i] longLongValue];

        NSLog(@"\nFirst Value is: %lld",firstValue);

        p->first = firstValue;
        p->second =  (int)N - i;

        NSLog(@"\n\nAfter append it to P:%lld and Int is: %d \n\n", p->first, p->second);

        //Store pointer p as NSValue.
        NSValue *value = [NSValue valueWithPointer:p];
        [v addObject:value];
    }


    [v sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) {

        //call `getValue` to get the pointer back..
        struct Pair *first;
        [obj1 getValue:&first];

        struct Pair *second;
        [obj2 getValue:&second];

        NSLog(@"%lld %d", first->first, first->second);

        return first->first < second->second;
    }];

    for(int i = 0;  i < N; i++) {
        NSValue *value = [v objectAtIndex:i];

        //Call `getValue` to get the pointer back..
        struct Pair *pair;
        [value getValue:&pair];

        NSLog(@"%lld %d", pair->first, pair->second);

        free(pair); //clean up..
    }
}
@end


int main() {
    @autoreleasepool {

        Main *main = [[Main alloc] init];
        [main main];
    }
    return 0;
}

Если вы не хотите использовать malloc и освобождать вещи или иметь дело с указателями (на необработанную память) .. то:

#import <Foundation/Foundation.h>

typedef long long ll;

@interface Main:NSObject
-(void) main;
@end

@implementation Main

-(void) main{

    struct Pair {
        ll first;
        int second;
    };

    NSMutableArray *v = [NSMutableArray new];
    int N = 3;
    NSMutableArray *vector = [NSMutableArray arrayWithCapacity:(int)N];

    int i;
    for(i=0;i<N;i++){

        ll value = (ll)i;
        printf("Value is: %lld",(ll)i);
        [vector addObject:[NSNumber numberWithLongLong:(value)]];
    }

    for(int i = 0; i < N; i++){

        struct Pair p;
        ll firstValue = [[vector objectAtIndex:i] longLongValue];

        NSLog(@"\nFirst Value is: %lld",firstValue);

        p.first = firstValue;
        p.second =  (int)N - i;

        NSLog(@"\n\nAfter append it to P:%lld and Int is: %d \n\n", p.first, p.second);

        //Encode p as a struct into an `NSValue`
        NSValue *value = [NSValue value:&p withObjCType:@encode(struct Pair)];
        [v addObject:value];
    }


    [v sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) {

        //Get each pair back
        struct Pair first;
        [obj1 getValue:&first];

        struct Pair second;
        [obj2 getValue:&second];

        NSLog(@"%lld %d",first.first, first.second);

        return first.first < second.second;
    }];

    for(int i = 0;  i < N; i++) {
        NSValue *value = [v objectAtIndex:i];

        //print each pair..
        struct Pair pair;
        [value getValue:&pair];

        NSLog(@"%lld %d", pair.first,pair.second);
    }
}
@end


int main() {
    @autoreleasepool {

        Main *main = [[Main alloc] init];
        [main main];
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...