2017-02-26 128 views
0

我已经写了下面这个获取最大数目的索引值。返回索引的最大值

int TravellingSalesMan::getMaximum(double *arr){ 
    double temp = arr[0]; 
    int iterator = 0; 
    for(int i = 0; i < 30; i++){ 
     if(arr[i] > temp){ 
      iterator = i; 
     } 
    } 
    return iterator; 
} 

但输出保持步入条件语句,并不断打印出29.我不知道为什么会这样

我使用max_element(也尝试过),但没有运气

EDIT

上述函数被调用,如下

static unsigned int chromosome = 30; 
double value[chromosome] 

for(int i = 0; i < chromosomes; i++){ 
    value[i] = estimateFitness(currPopultaion[i]); 
} 
int best = 0; 
best = getMaximum(value); 
cout<<best<<endl; // this just prints out 29 
+0

投票结束,因为缺少可重复的示例 –

+0

“保持打印出29” - 此代码中没有任何内容会生成任何输出。如何处理产生你所描述问题的[minimal,** complete **,example](https://stackoverflow.com/help/mcve)?而且,'temp = arr [i]'最好在某处,否则你所做的就是将所有内容与'arr [0]'中的任何内容进行比较。我的水晶球告诉我,阿尔[29]就是这样。 – WhozCraig

+0

首先,你使用变量名**迭代器**是非常错误的。它不用于迭代列表。为什么会造成混淆?最好使用像MaxIndex或类似的东西。 –

回答

2

好了,所以我没打算写答案,但我只看到了太多的逻辑错误的代码,我在评论部分写!

  • 首先,你的变量名iterator的使用是非常 错误。它不用于迭代列表。为什么会造成混淆。最好使用像max_index或类似的东西。

  • 为什么从i=0开始?你的临时值是arr[0],所以没有用。再次检查第一个元素。从i = 1开始!

  • temp是在功能毫无意义。最大索引最初应为0,如果有一些arr[i]大于arr[max_index],则设置为i

  • 分别传递长度与功能是更好的编码,因为它使代码更清晰。

  • arr的内容不被修改,因此防患于未然:使指针const


重新编写代码,它应该是:

int TravellingSalesMan::getMaximum(const double *arr,int len) 
{ 
    int max_index = 0; 
    for(int i = 1; i < len; i++) 
    { 
     if(arr[i] > arr[max_index]) 
      max_index = i; 
    } 
    return max_index; 
} 

值得关注,但在代码不变以上,leni,函数的结果应该所有是一个无符号整数类型。没有任何理由允许使用带符号的整数索引,因此如果通过硬指定unsignedsize_t作为索引变量类型,则可以将其作为来自调用者的警告条件。

+0

除了现实生活中没有意义的温度之外,所有合理的crtic要点。临时驻留在比arr [x]更快的存储区域中的机会很大,它甚至可能是CPU寄存器。在提问者的例子中,当找到一个新的最大值时,他忘记调整温度是毫无意义的。要保留在你的评论界中,'temp'当然应该是'max_val'之类的东西:) – grenix

+0

使用temp的编辑是由@WhozCraig提出的。我将继续作为这次讨论的旁观者(并且从这个领导者的角度学习一两件事):D –

2

当您找到新的最大值时,您应该为temp分配一个新值。

int TravellingSalesMan::getMaximum(double *arr){ 
    double temp = arr[0]; 
    int iterator = 0; 
    for(int i = 0; i < 30; i++){ 
     if(arr[i] > temp){ 
      iterator = i; 
      temp = arr[i]; // this was missing 
     } 
    } 
    return iterator; 
} 

如果没有这个,你正在寻找比指数零值更大的值的最大指数。

更好的解决方案是简单地使用std::max_element来代替。指针可以在大多数(如果不是全部的话)需要迭代器的算法中用作迭代器。

#include <algorithm> 

static unsigned int chromosomes = 30; 
double value[chromosomes]; 
for (int i=0; i<chromosomes; ++i) { 
    value[I] = estimate_fitness(current_population[i]); 
} 

double *max_elm = std::max_element(&value[0], &value[chromosomes]); 
int best = int(max_elm - &value[0]); 
std::cout << best << std::endl;