2011-07-22 4 views
2

私は、モンテカルロシミュレーションで重み付けサンプリングを行うテンプレート関数を作成しようとしました。それは以下の通りです。 input_dataは、静的に割り当てられた配列(すなわち、データ[33])、動的に割り当てられた配列、またはベクトルのいずれかです。STLの使用テンプレート関数内でソートする?

template <class myType> 
int init_roulette_calcs(myType &input_data, int inputlength, int *(&output_cdf), int highclassix, int weight) 
{ 
     sort(input_data, input_data + inputlength); //where the error occurs 

     //other code: 
     output_cdf = new int [inputlength]; 
     int k = 1; 
    for (int i = 0; i < inputlength; i++) 
    { 
     output_cdf[i] = k; 
     if (i+1 < highclassix) k++; 
     else k += weight; 
    } 
    return output_cdf[inputlength-1]; 
} 

テンプレート関数がsortの呼び出しで引数を推定できなかったため、コードはコンパイルされません。これは愚かな質問かもしれませんが、ソートが正しく機能するようにするためには何をする必要がありますか?

Error 4 error C2784: 'std::_Vb_iterator<_Alloc> std::operator 
+(_Alloc::difference_type,std::_Vb_iterator<_Alloc>)' : could not deduce template argument for 
'std::_Vb_iterator<_Alloc>' from 'int' j:\rdm\lrgv_2011-07-21\lrgv_src\lrgv.h 398 

ご協力いただきありがとうございます。

答えて

2

...ベクトルやソートで作業することができ、他の容器に切り替えることができあなたがこの部分を正しいものにしているので、x要素へのポインタ。

この問題は、ベクトルの場合には当てはまりません。なぜなら、.begin().end()関数を使用してこれらの場所へのポインタを取得する必要があるからです。

逆参照された開始/終了要素のアドレスをプルすることでソートを試みることができます。これにより、配列と同じベクトルを扱うことができます。

+0

ありがとうございます。私はベクトルを別々に扱わなければならないでしょう。 – Joe

+0

STLイテレータを未処理のポインタとして扱うべきではありません。また、実装によってはコードが壊れることもあります。 –

+0

私はそのステートメントに同意します - ベクトル実装は、標準で連続したメモリを使用するものとして定義されています。したがって、ポインタの算術演算で問題に対処するべきではありません。しかし、STLコンテナの一般的な使い方は、特にイテレータを使用中にコンテナ操作によって無効にすることができるため、一般的にはあまり良いことではありません。 –

1
sort(&input_data, &input_data + inputlength); 
    ^^^   ^^^  

あなたが渡している引数が実際には配列の最初の要素への参照であることを願っています。

+0

少し詳しく説明できますか?関数の引数として配列の最初の要素を渡そうとしましたが、多くのエラーがありました。 – Joe

2

あなたのコードでは、input_dataは参照ですが、sortは配列の先頭へのポインタである必要があります。それは次のようになります。

int init_roulette_calcs(myType input_data[], int inputlength, … 

ユーザが開始し、代わりにイテレータを終了するランダムアクセスのいずれかの種類を提供することができるようにテンプレートを作成するための適切なSTLの使用になりますが。したがって、後であなたは配列に格納した場合、配列名は、基本的に最初の要素へのポインタであり、配列name + xがある

template <class InputIterator> 
int init_roulette_calcs(InputIterator begin, InputIterator end, int *(&output_cdf), int highclassix, int weight) 
+0

ありがとうございます。 2つの質問:(1)動的に割り当てられた配列と静的に割り当てられた配列ではうまくいくようですが、stlベクターでは機能しません。 (2)引数リストをあなたが示唆したものに変更すると、関数を終了するときにデータがソートされますか?私はそのような価値があるとすれば、関数を終了してもデータは変更されないという印象を受けました。だから私は最初にリファレンスを使っていたのです。 – Joe

+0

最初のバージョンは実際には配列用に調整されていますが、2番目のバージョンはランダムアクセスのSTLコンテナで動作するはずです。また、価値観や参照によって渡すものを理解する必要があります。ポインタを値渡しすると、配列のコピーへのポインタではなく、ポインタのコピーが渡されます。 STLコンテナと同じです:イテレータを値渡しすると、関数はイテレータのコピーを見るので、コピーではなく元のコンテナとやりとりできます。 –

+0

あなたのフォローアップをありがとう。 – Joe

関連する問題