2016-11-15 4 views
1
template<typename T, typename F> 
auto mapV(vector<T> v, F f) { 
    vector<T> ret = {}; 
    for(int i=0; i < v.size(); i++) { 
     ret[i] = f(v[i]); 
    } 
    return ret; 
} 

int main() { 
    vector<int> v = {1,2,3,4,5,6}; 
    vector<int> b = mapV(v, [](int &t){ return t*2; }); 
    for (int n : b) { 
     cout << "is " << n << endl; 
    } 
    return 0; 
} 

このコードはコンパイルされますが、実行するとsegfaultが生成されます。テンプレートを使用して一般的に関数を受け入れる正しい方法は何ですか?私は関数の構造も定義したいと思います.Tをとり、Tを返す関数だけを受け入れることができますが、それを表現する方法はあまりよく分かりません。一般的に関数をC++テンプレートに渡す

これは、空のベクターを作成し、私はstd::function<T(T)>を試みたが、それはうまくいきませんでしたどちらか

+2

あなたは 'ret [i] = ...'で 'ret'の最後を書きます。 – user2357112

+1

ああ、代わりに要素をプッシュする必要がありますか? – leshow

+0

既存の回答を無効にしないでください。代わりに別の質問をしてください。 – Quentin

答えて

1
vector<T> ret = {}; 

for(int i=0; i < v.size(); i++) { 
    ret[i] = f(v[i]); 

これは、ベクトルretの値に何かを割り当てます。ベクトルretには既存の値はありません。 ret[0]はありません。 ret[1]などはありません。これは未定義の動作です。 operator[]はベクトルに新しい値を追加せず、既存の値のみを変更します。

これをpush_back()メソッドに置き換えます。

+0

質問のタイトルに関連するものはありますか?つまり、テンプレート内の関数の引数を受け入れる方法は?私は関数をT - > T型のものに制限したいと思っています。今は何も受け付けていません。 – leshow

+0

パラメータを 'std :: function'変数に割り当てることができます。また、適切なタイプを使用してテンプレートを特殊化することもできます。 –

+0

?コンパイラの型は関数を適切にチェックしますか? – leshow

関連する問題