我打算对std :: vector数组的每个数据执行一个操作,如下面的代码所示:
std::vector<int> abc;
abc.push_back(1);
abc.push_back(5);
abc.push_back(2);
std::sort(abc);
int min = abc[0];
int max = abc[2];
for(int i=0; i<3; i++)
abc[i] = (abc[i]-min)/(max-min);
我现在的问题是,我有更优雅的表现方式
for(int i=0; i<3; i++)
abc[i] = (abc[i]-min)/(max-min)
使用for_each , trasnform
或stl中的其他方法。我对这些功能的困难在于我不知道如何在其中加入外部参数。
答案 0 :(得分:4)
以下示例使用for_each
更新abc
中的每个元素:
std::for_each(abc.begin(), // Start of range
abc.end(), // End of range
[=](int &value) // The operation to apply
{
value=(value-min)/(max-min);
});
尽管for_each
保证了遍历的顺序以及每个元素发生了多少次调用,但是for_each
常常不赞成更改被transform
迭代的序列。但是,为了安抚反对者,您可能希望使用std::transform(abc.begin(), // Start of source range
abc.end(), // End of source range
abc.begin(), // Start of destination range
[=](int value) // The operation to apply
{
return (value-min)/(max-min);
});
代替没有此类保证(order of traversal和谓词调用次数,而不是通过complexity guarantee {注意:复杂性已经过修改,以保证C ++ 11中的调用次数,见25.3.4.4}):
{{1}}
顺便说一下,既然你在公式中进行整数除法,你必须非常小心截断结果。您也应该检查除以零。
答案 1 :(得分:4)
使用C ++ 11,您可以使用捕获所需变量的lambda:
std::transform(std::begin(abc), std::end(abc),
std::begin(abc),
[=](int x) { return (x-min)/(max-min); });
这相当于你的循环,尽管你可能想要首先验证逻辑是否正确。
答案 2 :(得分:4)
使用std::transform
和合适的函子很容易实现。这里,lambda用于简洁:
std::transform(std::begin(abc),
std::end(abc),
std::begin(abc),
[&](int i) { return (i-min)/(max-min); });
目前尚不清楚这是否有所改善。我只想写一个基于范围的简单循环:
for(int& i : abc)
i = (i-min)/(max-min);