2011-09-04 3 views
2

NSDictionary 매핑 정수를 부동 소수점 값으로 변환하여 원본 NSDictionary의 키가 벡터의 인덱스 인 C++ std :: vector로 변환하려고합니다.NSDictionary를 std :: vector로 변환

내가 생각하는 코드가 있지만 사전에 키 - 값 쌍의 수보다 큰 벡터를 만드는 것으로 보입니다. 내가 벡터에 색인을 붙이는 방식과 관련이 있다고 생각합니다.

도움을 주시면 감사하겠습니다. 숫자가 많은 항목으로 시작하는 것을 생성과

static std::vector<float> convert(NSDictionary* dictionary) 
    { 
     std::vector<float> result(16); 
     NSArray* keys = [dictionary allKeys]; 
     for(id key in keys) 
     {   
      id value = [dictionary objectForKey: key]; 
      float fValue = [value floatValue]; 
      int index = [key intValue]; 
      result.insert(result.begin() + index, fValue); 
     } 
     return result; 
    } 
+3

왜 당신은'표준 : :지도'를 사용하지 마십시오. STL에있는 NSDictionary의 대응 부분입니다. 아마 키가 정렬되지 않고 임의로 인덱스를'std :: vector'에 삽입 할 수 없습니다. 당신은 순서대로해야합니다 : 0, 1, 2, 3 ... –

+1

내가 NSDictionary를 제공하는 플러그인을 작성 중이므로 API를 사용하여이를 전달하려고합니다. std :: vector가 필요합니다. – ekj

답변

4

벡터를 초기화 방법 : 여기

는 내가 가지고있는 코드입니다. 이 경우 벡터는 16 개의 요소로 시작하고 각 삽입은 요소를 추가하므로 16 + N 요소로 끝납니다.

요소를 새로운 값으로 변경하려면 요소에 값을 할당하기 만하면됩니다. 삽입 사용하지 마십시오 그러나

result[index] = fValue; 

을, 당신은 정말 map<int, float>을 사용해야합니다

std::map<int, float> result; 
NSArray* keys = [dictionary allKeys]; 
for(id key in keys) 
{   
    id value = [dictionary objectForKey: key]; 
    float fValue = [value floatValue]; 
    int index = [key intValue]; 
    result[index] = fValue; 
} 
+0

첫 번째 해결 방법은 올바른 것으로 보입니다. std :: map을 사용할 수 없습니다. 왜냐하면 저는 NSDictionary를 제공하는 플러그인을 작성하고 있기 때문에이를 사용하기 위해 std :: vector가 필요한 API를 전달하려고합니다. by, 어떻게 코드 블록을 사용할 수 있습니까? – ekj

+0

@ekj : 질문 당 하나의 질문을주십시오. –

+0

죄송합니다. 스택 오버플로 게시를 의미했습니다. 그러나 나는 그것을 알아 냈다 : - D. 나는 여기서 n00b이다 – ekj

0

당신이 당신의 키는 벡터에 인덱스를하게해야한다고 때문에, 당신은 당신의 키를 정렬 할 수 있습니다.
테스트되지 않은 예 :

static std::vector<float> convert(NSDictionary* dictionary) 
{ 
    std::vector<float> result; 
    NSArray* keys = [dictionary allKeys]; 
    result.reserve([keys count]); // since you know the extent 
    for (id key in [keys sortedArrayUsingSelector:@selector(compare:)]) 
    {   
     id value = [dictionary objectForKey:key]; 
     float fValue = [value floatValue]; 
     int index = [key intValue]; 
     result.push_back(fValue); 
    } 
    return result; 
} 
+0

키가 연속 된 집합 (정렬 된 경우)을 형성한다고 가정하면 정렬이 필요 없다고 생각한다. 지금 내가 작동하도록하는 방법은 vector를 [keys count]로 초기화 한 다음 결과 [index] = fValue – ekj

+0

을 사용하는 것입니다. 그러면 아마도 더 효율적인 구현이 될 것입니다. 하지만지도가 필요 없다고 생각합니다. 제 요점이었습니다. – Richard

관련 문제