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;
}
此代码编译但运行时会生成段错误。一般使用模板接受函数的正确方法是什么?我也想定义函数的结构,可以说我只接受一个带T的函数并返回一个T,但我不太清楚如何表达它。
我尝试使用std::function<T(T)>
,但这不起作用
答案 0 :(得分: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()
方法。