2017-01-21 3 views
-1

私は二重の値を返す関数calculateDistance()によって返される値に応じてベクトルをソートしようとしています。私は問題がpermutationCopmaratorメソッドによって引き起こされると思います。 .cppファイルには、次のようになります。C++あなたのクラスの関数に基づいてコンパレータでstd :: sortを使う方法

bool TSPgenetic::permutationComparator(int* i, int* j){ 
    return calculateDistance(i) < calculateDistance(j); 
} 

void TSPgenetic::chooseNewPopulation(){ 

    sort(population->begin(), population->end(), permutationComparator); 
    sort(children->begin(), children->end(), permutationComparator); 

`....` 

} 

ヘッダファイルの断片:std::sortの三番目のパラメータが有効ではないよう

bool permutationComparator(int*, int*); 
+0

これにはどのような問題がありますか? – NathanOliver

+1

なぜ整数へのポインタ*のベクトルがありますか?なぜあなたはそれを割り当てて積み上げているのですか?なぜ同じ演算子で同じ範囲をソートしているのですか* 2回*? –

+0

Im申し訳ありません、書くのを忘れた エラー\t C3867 \t 'TSPgenetic :: permutationComparator':非標準構文。 '&'を使用してメンバーへのポインタを作成します。 – Barcys

答えて

1

permutationComparatorを渡します。 staticクラスメンバーのみが有効でファンクターオブジェクトです。

  • lambda expressionを使用して閉鎖オブジェクトを作成し、そこにあなたの比較を行います。問題を解決するには、ここでは4つの選択肢があります。

    std::sort(population->begin(), population->end(), [](const int *i1, const int *i2){return calculateDistance(i1) < calculateDistance(i2);}); 
    
  • あなたcomparsion機能がstaticである必要はない場合は、std::bindを使用することができます。

    auto comp_func = std::bind(&TSPgenetic::permutationComparator, this, std::placeholders::_1, std::placeholders::_2); 
    std::sort(population->begin(), population->end(), comp_func); 
    
  • それが可能だ場合、あなたの比較関数staticを行います。

  • オーバーロードbool operator() (const int *i1, const int *i2)あなたのクラスはfunctor objectになるようにしてください。

論理的に比較関数はメンバー関数であってはならないことに注意してください。 2つのオブジェクトを取り、その順序を決定する関数です。したがって、ほとんどの場合、の3番目のオプションのみが適用されます。

+0

、またはできるだけ静的にするだけです。 – NathanOliver

関連する問題