2017-02-26 8 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を印刷し続けます」 - このコードには何も出力がありません。記述している問題を引き起こす[最小、**完全**、例](https://stackoverflow.com/help/mcve)はどうですか?そしてfyi、 'temp = arr [i]'はどこかにあるほうが良いでしょう。そうしていれば、すべてを 'arr [0]'にあるものと比較するだけです。私のクリスタルボールは私に、 'arr [29]'がそうであると伝えます。 – WhozCraig

+0

まず、変数名** iterator **の使用は非常に間違っています。リストの反復処理には使用されません。なぜ混乱を起こすのですか? MaxIndexなどのものを使うのがベストです。 –

答えて

2

わかりましたので、私は答えを書くことを計画していなかったが、私はちょうど私がコメント欄に書き込むためのコードでは、あまりにも多くの論理的なミスを見ました!

  • まず、変数名iteratorの使用は非常に 間違っています。リストの反復処理には使用されません。なぜ混乱を招くのか? max_indexなどのようなものを使用するのがベストです。

  • なぜi=0から始めますか?あなたの一時的な値はarr[0]なので、使用しません。最初の要素でもう一度チェックします。私は1から始まる!

  • tempその関数で無意味です。最大インデックスは、最初に0であり、arr[max_index]より大きいarr[i]がある場合は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、および関数の結果必要がありますすべては符号なし整数型です。符号付き整数インデックスを許可する理由はありませんので、インデックス変数の型としてunsignedを指定するか、size_tと指定して呼び出し元から警告状態にしてください。

+0

実生活における一時的な無意味さを除いて、すべての妥当なcrtic点。 tempは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; 
関連する問題