2014-12-07 12 views
0

나는 카운터에서 각 체크 아웃에 소비 된 액수를 계산하는 함수를 가지고있다. 계산 후에 가장 좋은 체크 아웃 카운터를 찾고 싶다. 가장 큰 체크 아웃의 인덱스를 찾을 수는 있지만, 나는 혼란 스럽다. 두 번째로 큰 계산대를 찾는 것과 관련이 있습니다. 다음은 코드입니다.배열 컬렉션에서 두 번째로 큰 요소의 인덱스를 찾는 방법은 무엇입니까?

for (int j = 0; j < Bq[i]; j++) 
{ 
    sumM += p.GetValue(i, j).GetSum(); 
    sumT += p.GetValue(i, j).GetTime(); 
} 
indexofmax = i; 
if(sumM > maxmoney) 
{ 
    Secondbestcheckout=firstbestcheckout; 
    firstbestcheckout = indexofmax+1; 
    maxmoney = sumM; 
    secondindex = Secondbestcheckout; 
    indexofmax =firstbestcheckout; 
} 
fr << i+1 << fixed << setw(9) << setprecision(2) << sumM 
    << " " << setw(6) << sumT << endl; 
} 
fr << "The first best checkout interms of money collected is " 
    << firstbestcheckout << "And the second best checkout is " 
    << secondindex << endl; 

이 코드는 가장 큰 체크 아웃 카운터의 인덱스 인쇄에는 성공했지만 두 번째로 큰 인덱스 인쇄에는 성공하지 못했습니다.

+0

이것은 내 첫 번째 게시물입니다. 나는 도구를 가지고 노는 것을 몰랐습니다. –

+0

나는 새로운 것을 본다. 환영! 나는 너에게 강타하고 있지 않았다, 나는 다만 당신의 나쁜 들여 쓰기가 아직도 읽기 쉽다는 것을 그것이 재미 있었다는 것을 찾아 냈다. :) 통행료에 익숙해 질거야, 걱정마. – bolov

+0

복잡한 솔루션에서는 쉽게 문제가되는 것처럼 보입니다. 당신은 많은 관련 코드를 놓치고 있습니다. 예를 들어, 반복문이 없을 때 색인이 'i'인 방법을 볼 수 없습니다. 모든 관련 코드를 제공하려고하지만 관련 코드 만 제공하십시오. – SHR

답변

0

두 번째 최고는 최상의 성능을 보인 경우에만 전송되지 않습니다. (40)가 그 다음 60 그것이 40 번째 최고의하게 대체와

예제 코드, 당신이 가장 설정된 주먹 시간으로 40, 60, 50, 30

와 함께입니다. 50 세까지 도착하지만 최고를 능가하지 못하므로 차선책으로 무시됩니다.

이 경우 처리하기 위해, 절을 추가해야합니다 : (당신이 체크 아웃 수십억보다 적은 경우, 즉) 당신은 메모리에 모든 값을 유지할 수 있다면, 당신이 std::partial_sort를 사용할 수 있습니다

... 
if (sumM > maxmoney) // as you already did 
{ 
    Secondbestcheckout=firstbestcheckout; 
    firstbestcheckout = indexofmax+1; 
    secondmaxmoney = maxmoney; // <<NEW INSTRUCTION - of course, you'll need to create and init secondmaxmoney somewhere ;-) 
    maxmoney = sumM; 
    secondindex = Secondbestcheckout; 
    indexofmax =firstbestcheckout; 
} 
else if (sumM > secondmaxmoney)  // NEW STATEMENT 
{ 
    Secondbestcheckout= ...;  // as above, but unclear for me what the difference with secondinex is 
    secondmaxmoney = maxmoney;  // update amount onf second best 
    secondindex = i;    // or i+1 ? Not clear if you start from 0 or from 1 
} 
... // rest or your code 
+0

에 의해 잡혀있다. 나는 코드를 이해하지 못한다. 내 문제에 코드 w.r.t를 쓸 수 있겠는가? –

+0

@ 노누니즈 코드를 완료했습니다. 필자는 모든 변수의 의미가 없기 때문에 secondbestchekedout과 firstbestcheckedout에 대해 여전히 의문을 가지고 있습니다. 인쇄 할 때 금액으로 제시 했으므로 인덱스에 1을 더하면 분명히 복사됩니다. – Christophe

0

을 (나는 가정의 두 가지 경우, 술어는 std::greater을해야합니다.) 가장 큰 두 요소를 정렬 (그러나 나머지 정렬되지 않은 떠나), 또는 당신이 1 회, 2 회 std::nth_element을 사용할 수 있습니다 2. 한 번 당신이 필요로하는 경우

스트리밍 형식 (즉, 일정한 공간)으로 값을 처리하려면 각 순서를 추적해야합니다. 색인은 별도로, 당신이 이미 시도하고있는 것과 본질적으로 유사합니다. Boost.Accumulators는 작업을 단순화 할 수있는 몇 가지 도구가있을 수 있습니다.

관련 문제