2013-09-22 2 views
0

일부 빠른 정렬 알고리즘을 구현하고 있으며 최고의 성능을 얻으려면 Objective-C에서 C++ 바인딩을 사용하고 싶습니다. 그러나 내 알고리즘을 사용자 지정 개체 및 NSComparator와 유사한 개체로 작업하기를 원합니다. 어떤 C++에서 이러한 객체를 사용할 수 있습니까? 수업을 템플릿으로 만들 수 있습니까?C++에서 사용자 정의 Objective-C 객체를 사용하는 방법?

C++에서 사용자 지정 개체를 바인딩하고 C++에서 NSComparator를 사용하는 최상의 솔루션에 대해 알려주십시오.

가장 좋은 점은

Hervé HL입니다.

+1

정적으로 입력하는 속도와 동적으로 입력 할 수있는 유연성을 둘 다 가질 수는 없습니다. 가장 빠른 솔루션은 템플릿과 일부 오버로드 된 비교 기능을 사용하는 것입니다. 두 번째로 빠른 방법은 함수 포인터를 습지 표준 C 함수에 보내는 것입니다. 또한 매크로를 사용하고 싶을 수도 있습니다 (좋은 QSORT-as-a-macro가 매우 좋은 성능을 제공합니다) – Dave

+0

좋아, 나는 어떤 종류의 객체가 있더라도 C++에서 포인터를 움직일 수있을 것으로 기대하고있었습니다. 각 메모리 조각 (사용자 지정 개체 여부). C++ 구현은 flexivity를 유지하는 올바른 해결책으로 보이지 않습니다. 바로 Objective-C에서이를 수행 할 것입니다! 답장을 보내 주셔서 감사합니다 @Dave! –

+0

하실 수 있습니다. 그러나 문제는 비교 기능을 호출 할 수 있습니다. 예를 들어, 아무 문제없이 목록을 되돌릴 수 있습니다. – Dave

답변

0

@Dave 덕분에, NSArray에서 포인터를 추출하는 솔루션을 찾았습니다. 포함 된 유형에 관계없이 복잡한 작업을 수행 한 다음 void * 유형을 사용하여 포인터를 다시 어셈블합니다.

Objective-C++ 기능을 사용하려면 .m 파일의 이름을 .mm으로 바꿉니다.

void *array[[self count]]; //create an empty void* array 
for (uint i = 0; i < [self count]; i++) 
{ 
    int address = (int)[self objectAtIndex:i]; 
    array[i] = (void *)address; //insert NSObjects pointers into void* array 
} 

은 다음과 같이 진행 무효 * 배열에서 NSObjects을 다시 얻으려면 :

NSMutableArray *doneAr = [[NSMutableArray alloc] init]; //create a NSMutableArray 
for (uint i = 0; i < [self count]; i++) 
{ 
    void *tmp = (void **)done + i; //extract the pointer in the void* array 
    NSString *strTmp = (NSString *)(*((Class *)tmp)); //convert it back to origin type (here NSString *) 
    [doneAr addObject:strTmp]; //add it back to the previously created NSMutableArray 
} 

희망이 답변이 미래의 문제에 대한 도움이 될 수 있습니다. C++ 구현에서 나 같은 NSComparator를 사용하려면 Objective-C++ 기능을 사용할 수 있도록 .m 파일의 이름을 .mm 파일로 바꿉니다. 그런 다음 필요한 것을 가져와 사용하십시오 (예 : NSComparator).

+0

이 코드는 유효합니다 (장소가 조금 이상한 경우).하지만 첫 번째 주석에서 말한 것처럼 * 비교 *는 어렵습니다. 정렬 할 때 객체의 유형을 알아야하고 다양한 요소 쌍에 대해 적절한 비교 함수를 호출해야하지만이 코드에서는 해당 정보를 잃어 버렸습니다. 당신이 원할 수있는 가장 좋은 것은 집합 타입 (여기서는'NSString'에서만 실행될 것으로 가정하고있는 것처럼 보임)이나 메모리 주소에 따라 정렬하는 것입니다. 그리고 만약 당신이 어떻게 든 당신의 비교 함수에서 모든 Objective C 호출을 제거 할 수 없다면, 나는 C++의 속도를 가지지 않을까 걱정됩니다. – Dave

+0

실제로 당신 말이 맞습니다. 그것은 가능하지만 높은 수의 변환은 C++을 사용하는 것보다 정렬을 느리게 만듭니다. 이러한 작업을 수행하는 방법을 계속 찾고이 주제를 최신 상태로 유지하십시오! –

관련 문제