如何使用divids和for_each?

时间:2019-12-22 17:18:10

标签: c++ foreach c++-standard-library elementwise-operations

我有:

vector<double> ved1 = { 1,2,3,4,5,6,7,8,9,10 };
vector<double> ved2 = { 11,12,13,14,15,16,17,18,19,20 };
vector<double> ved3(10);

,我想拥有ved3 = ved3 / 2,但我无法正确获取,结果是2 / ved3; 如何使用分隔线?

transform(ved1.begin(), ved1.end(), ved2.begin(), ved3.begin(), plus<double>());
transform(ved3.begin(), ved3.end(), ved3.begin(), bind1st(divides<double>(),2));`    

我想要cos(ved2),但我不明白。我的代码有什么问题?

double cos_1(double x) { return cos(x); }
for_each(ved2.begin(), ved2.end(), cos_1);

2 个答案:

答案 0 :(得分:2)

bind1st2绑定到divides的第一个参数,然后transformved3的每个元素提供给divides作为第二个论点。因此结果将是divides(2, ved3[0])divides(2, ved3[1]),依此类推。

如果您想计算divides(ved3[...], 2),请使用bind2nd(divides<double>(), 2)。这样,2将被绑定到第二个参数,而第一个参数将transform保留为空。

答案 1 :(得分:1)

如何使用std::for_each逐元素应用余弦

std::for_each未填充某些输出;或必须更改输入容器/范围。它只是将可调用对象应用于范围的每个元素。如果该函数没有“副作用”,则for_each将无用。具体来说,在您的情况下-您正在计算每个值的余弦值,但不对其执行任何操作。

如果要就地更改值,则需要专门进行以下操作:

void apply_cos(double& x) { x = std::cos(x); }

// ...

for_each(ved2.begin(), ved2.end(), apply_cos);

或使用lambda表达式:

for_each(ved2.begin(), ved2.end(), [](double& x) { x = cos(x); });

请注意使用对该功能的引用输入而不是double& x,而不是double x。这意味着,当您在x中更改apply_cos()时,输入范围std::for_each中的值也会更改。