2017-02-26 74 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;