“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 << ", ";
});