Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“std::for_each”的问题没有按预期将函数映射到向量上 我最近开始玩C++,我来自功能性的领域,所以你可以想象我发现FoSyAube的功能时的解脱,然后我发现我不能让它做我想做的事时我的沮丧。我想要实现的是一个简单的for循环,但我似乎已经产生了过敏。不管怎样,有些事情是有效的:例如: int main () { std::vector<std::string> numbers {"-1.2","2.2","3.3","4.4","5.5"}; std::for_each(numbers.begin(), numbers.end(), [](std::string& i) { std::stof(i); }); for(auto num : numbers) { std::cout << num << "\n"; } return 0; }_C++ - Fatal编程技术网

“std::for_each”的问题没有按预期将函数映射到向量上 我最近开始玩C++,我来自功能性的领域,所以你可以想象我发现FoSyAube的功能时的解脱,然后我发现我不能让它做我想做的事时我的沮丧。我想要实现的是一个简单的for循环,但我似乎已经产生了过敏。不管怎样,有些事情是有效的:例如: int main () { std::vector<std::string> numbers {"-1.2","2.2","3.3","4.4","5.5"}; std::for_each(numbers.begin(), numbers.end(), [](std::string& i) { std::stof(i); }); for(auto num : numbers) { std::cout << num << "\n"; } return 0; }

“std::for_each”的问题没有按预期将函数映射到向量上 我最近开始玩C++,我来自功能性的领域,所以你可以想象我发现FoSyAube的功能时的解脱,然后我发现我不能让它做我想做的事时我的沮丧。我想要实现的是一个简单的for循环,但我似乎已经产生了过敏。不管怎样,有些事情是有效的:例如: int main () { std::vector<std::string> numbers {"-1.2","2.2","3.3","4.4","5.5"}; std::for_each(numbers.begin(), numbers.end(), [](std::string& i) { std::stof(i); }); for(auto num : numbers) { std::cout << num << "\n"; } return 0; },c++,C++,似乎有效。但这并不是: vector<float> f(vector<string> numbers) { std::for_each(numbers.begin(), numbers.end(), [](std::string& i) { std::stof(i); }); return numbers; } std::vector<std::string> numbers {"-1.2","2.2"

似乎有效。但这并不是:

vector<float> f(vector<string> numbers) {

std::for_each(numbers.begin(), numbers.end(), [](std::string& i) {
   std::stof(i);
});

return numbers;
}

std::vector<std::string> numbers {"-1.2","2.2","3.3","4.4","5.5"};
f(numbers);
编译器告诉我,在本例中,他无法将基本_字符串转换为向量,我无法理解,因为这是stof应该做的。起初,我认为我应该将另一个向量绑定到for-each,如下所示:

vector<float> actualnumbers = std::for_each( numbers.begin(), numbers.end()
                                           , [](std::string& i) {std::stof(i);});
然后返回,但这似乎也不起作用。有人能启发我吗?我做错了什么

另外,我还尝试过编写自己的映射函数:

template <typename T, typename U>
vector<T> map (T (*f)(U), vector<U> vec) {
  vector<T> out;
  for (auto v : vec)
  {
  out.push_back((*f)(v));
  };
  return out;
};
只要不给它提供lambda函数,这个函数就可以工作,我不确定lambda函数和其他函数之间为什么会有区别?但它也感觉像是一个黑客,这不是我应该能够为每个元素做的吗?

std::for_每个元素都应用一个函数,将void返回到集合的每个元素,因为std::stof是一个纯函数,您正在默默地执行no-op。特别是,您没有就地转换向量的元素。正确的方法是使用std::transform:

std::for_each向集合的每个元素应用一个返回void的函数,因为std::stof是一个纯函数,您正在静默地执行no-op。特别是,您没有就地转换向量的元素。正确的方法是使用std::transform:


数字是一个向量-您不能在运行时更改其类型。您需要创建一个向量并将转换后的值填入其中,这样您就可以返回它,这样您就完全忽略了std::stof的返回值,使lambda变得非常无用。您对std::for_的调用都不做任何事情。std::stof返回转换的结果,然后丢弃它。此外,C++是静态类型的:一旦你写了STD::矢量数字,数字只能是向量,而不是向量或其他东西。关于你的P.S.,函数指针没有存储LAMBDA捕获的空间。它指向一个函数,包括一个没有捕获的lambda,因为这只是一个有语法的函数。你传递的是一个带有向量fvector编号的向量副本,而你应该写向量fvector&编号。编号是一个向量-你不能在运行时更改它的类型。您需要创建一个向量并将转换后的值填入其中,这样您就可以返回它,这样您就完全忽略了std::stof的返回值,使lambda变得非常无用。您对std::for_的调用都不做任何事情。std::stof返回转换的结果,然后丢弃它。此外,C++是静态类型的:一旦你写了STD::矢量数字,数字只能是向量,而不是向量或其他东西。关于你的P.S.,函数指针没有存储LAMBDA捕获的空间。它指向一个函数,它包括一个没有捕获的lambda,因为这只是一个有语法的函数。你传递的是一个带有向量fvector编号的向量副本,而你应该写向量fvector&编号。非常感谢,这让事情变得更清楚了。因此,对于_,每个函数本身不返回任何内容,它只是按顺序应用函数,由我来组织它们返回的内容,如果我愿意,或者我应该按照您的建议使用transform。@Orbit for_,每个函数不返回任何内容。从功能上讲,它实际上只用于已通过的lambda的副作用。非常感谢,这让事情变得更清楚了。因此,对于_,每个函数本身不返回任何内容,它只是按顺序应用函数,由我来组织它们返回的内容,如果我愿意,或者我应该按照您的建议使用transform。@Orbit for_,每个函数不返回任何内容。从功能上讲,它实际上只用于已通过的lambda的副作用。
std::vector<std::string> numbers {"-1.2","2.2","3.3","4.4","5.5"};
std::vector<float> floats;
std::transform(numbers.begin(), numbers.end(), std::back_inserter(floats),
               [](const std::string& i) { return std::stof(i); }));

std::for_each(floats.begin(), floats.end(), [](float i) {
   std::cout << i << ", ";
});