2014-12-07 88 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

这是我在这里的第一篇文章,我不知道玩的工具。 – 2014-12-07 12:39:36

+0

我看你是新的。欢迎!我不是在抨击你,我只是觉得你的坏缩进仍然是可读的:)。你会习惯收费的,不用担心。 – bolov 2014-12-07 12:41:13

+0

这看起来像一个复杂解决方案的简单问题。你错过了很多相关的代码。例如,我看不到,如果在没有迭代的情况下“i”是指数。尽量给所有相关的代码,但只有相关的代码。 – SHR 2014-12-07 12:45:16

回答

0

第二好的不是只有当你超越最好的时候才发送。

实施例40,60,50,30

与您的代码时,只要设定最佳的拳头时间,是40。然后60替换它的40成为第二最佳。到了50,但它并没有超过最好的表现,因此被忽略为次佳。

您必须添加一个条款,来处理这种情况:

... 
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

catched我不太了解代码,你可以写代码w.r.t我的问题。 – 2014-12-07 12:56:50

+0

@NooruNizu我已经完成了代码。由于我没有所有变量的含义,所以我仍然对第二次检查和第一次检查结果有疑问,因为在印刷中您建议这些是变量,但是它们显然是从您添加的索引1复制而来的。 – Christophe 2014-12-07 13:20:46

0

如果你能保持在内存中的所有值(即,如果你有超过十亿检出的较少),您可以使用std::partial_sort来排序两个最大的元素(但剩下的未排序),或者可以使用两次,一次使用1次和使用2次。(在两种情况下,我认为您的谓词应该是std::greater

如果您需要以流媒体的方式处理价值(即持续空间),那么您需要跟踪每个订单索引分开,基本上类似于你已经尝试的。 Boost.Accumulators可能有一些工具来简化这项任务。

相关问题