2013-03-15 3 views
-1
string* Foooood::topFiveFoo(){  
    std::map<std::string, unsigned long> volumes; 
    typedef std::map<std::string, unsigned long>::iterator it_type; 

    for(i=0;i<nTransactions;i++){ 
     volumes[tDeque.at(i).fooSymbol] += tDeque.at(i).fooShares; 
    } 

    string top; 
    string result[5]; 
    int check = 0; 

    for(i=0;i<5;i++){ 
     for(it_type iterator = volumes.begin(); iterator != volumes.end(); iterator++) { 
      if(iterator->second > check){ 
       top = iterator->first; 
       check = iterator->second; 
      } 

      result[i] = top; 
      volumes.erase(top); 
     } 
    } 
    return new string[5]; 
} 

12 시간 미만의지도에 대해서만 학습 했으므로 여전히 혼란 스럽습니다.
오류가 계속 발생합니다 : "디버그 어설 션이 실패했습니다!" ..... "표현식 : 반복자를 맵핑하거나 설정하지 마십시오."지도에서 레코드를 삭제할 수 없습니다

내 머리 속에 배열에 값을 저장 한 다음지도에서 삭제하면이 작업을 반복 할 수 있습니다. 상위 5 목록을 생성하십시오! ?? 그러나 나는 최고의 가치를 지울 수 없으며 그 이유를 알 수 없습니다. 삭제 된 요소로 반복자 포인트, 그것은 erase 후 무효가되어, 경우 std::map::erase

Iterator validity
Iterators, pointers and references referring to elements removed by the function are invalidated. All other iterators, pointers and references keep their validity.

에서

+0

여기서'nTransactions'을 (를) 설정합니까? –

+0

두 번째 for 루프 다음에 어딘가에 닫는 대괄호가 누락되었습니다. 어디로 가야합니까? – Xymostech

+0

'nTransactions'은 클래스 외부에 저장됩니다. – Will

답변

1

그래서, 당신은 그것을 증가 할 수 없습니다.

반환 값은 또 다른 포인트입니다. 배열 result을 반환하려면 먼저 복사하거나 힙에 즉시 할당해야합니다. 지금은 빈 std::string 배열을 반환합니다.

std::string *result = new std::string[5]; 
for(i=0;i<5;i++){ 
    for(it_type iterator = volumes.begin(); iterator != volumes.end(); iterator++) { 
     if(iterator->second > check){ 
      top = iterator->first; 
      check = iterator->second; 
     } 
    } 

    result[i] = top; 
    volumes.erase(top); 
} 

return result; 
+0

반복기 루프 외부에서 삭제하면지도 레코드를 다시 계산할 수 있다는 생각이 들었습니까? – Will

+0

@will'volumes.erase (top);'는 루프 반복자 안에 있습니다. –

+0

내 코드는 내가 당신이 절대적으로 옳았다는 것을 깨달은 그런 혼란입니다! 문제는 나의'volumes.erase (top);'가 for 루프 안에 있다는 것입니다! 고맙습니다! :) – Will

관련 문제