标准库中是否有一个算法可以为std :: vector的每个元素添加一个值?就像是
std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);
Run Code Online (Sandbox Code Playgroud)
为每个元素添加值1.0?
如果在STL中没有一个很好的(例如简短,美观,易读)方法,那么提升怎么样?
Gen*_*yev 50
如果你使用C++ 0x,使用lambda函数更短:
std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});
Run Code Online (Sandbox Code Playgroud)
Mic*_*fik 36
看看std::for_each
和std::transform
.后者接受三个迭代器(序列的开始和结束,以及输出序列的开始)和一个函数对象.有几种方法可以写这个.一种方法,只使用标准的东西,是:
transform(myvec.begin(), myvec.end(), myvec.begin(),
bind2nd(std::plus<double>(), 1.0));
Run Code Online (Sandbox Code Playgroud)
您也可以使用它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));
Run Code Online (Sandbox Code Playgroud)
Tho*_*tit 13
普通C++ 0X中最短的方法是:
for(double& d : myvec)
d += 1.0;
Run Code Online (Sandbox Code Playgroud)
并提升:
for_each(myvec, _1 += 1.0); // boost.range + boost.lambda
Run Code Online (Sandbox Code Playgroud)
std::transform( myvec.begin(), myvec.end(),
myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );
Run Code Online (Sandbox Code Playgroud)
如果您对向量执行大量数学运算感兴趣,可能需要查看<valarray>
标准库的一部分.它基本上是std::vector<>
为矢量数值计算(切片,数学函数,逐点运算符等)而设计的.
唯一真正糟糕的部分是它没有简单的转换std::vector<>
.
归档时间: |
|
查看次数: |
24294 次 |
最近记录: |