标准库中是否有一个算法可以为std :: vector的每个元素添加一个值? 像
这样的东西std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);
将值1.0添加到每个元素?
如果在STL中没有一个好的(例如简短,美观,易读)的方法,那么提升怎么样?
答案 0 :(得分:47)
使用lambda函数时更短,如果使用C ++ 0x:
std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});
答案 1 :(得分:36)
查看std::for_each
和std::transform
。后者接受三个迭代器(序列的开始和结束,以及输出序列的开始)和一个函数对象。有几种方法可以写这个。一种方式,只使用标准的东西,是:
transform(myvec.begin(), myvec.end(), myvec.begin(),
bind2nd(std::plus<double>(), 1.0));
您也可以使用for_each
执行此操作,但std::plus
的默认行为不会将答案写回原始矢量。在这种情况下,你必须编写自己的仿函数。简单的例子如下:
struct AddVal
{
double val;
AddVal(double v) : val(v);
void operator()(double &elem) const
{
elem += v;
}
};
std::for_each(myvec.begin(), myvec.end(), AddVal(1.0));
答案 2 :(得分:12)
普通C ++ 0X中最短的方法是:
for(double& d : myvec)
d += 1.0;
并使用提升:
for_each(myvec, _1 += 1.0); // boost.range + boost.lambda
答案 3 :(得分:9)
std::transform( myvec.begin(), myvec.end(),
myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );
答案 4 :(得分:5)
如果您对向量执行大量数学运算感兴趣,可能需要查看标准库的<valarray>
部分。它基本上是std::vector<>
设计用于矢量数值计算(切片,数学函数,逐点运算符等)。
真正糟糕的唯一部分是std::vector<>
无法轻松转换。
答案 5 :(得分:0)
最好的方法是添加std::transform()
和lambda表达式。
#include <vector>
#include <algorithm>
std::vector<double> myVector;
double constantElement;
std::transform<myvector.begin(), myVector.end(), myVector.begin(),[&](auto& value){ return value+constantElement;});