STL方法为std :: vector添加一个常量值

时间:2010-12-16 13:53:35

标签: c++ stl

标准库中是否有一个算法可以为std :: vector的每个元素添加一个值? 像

这样的东西
std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);

将值1.0添加到每个元素?

如果在STL中没有一个好的(例如简短,美观,易读)的方法,那么提升怎么样?

6 个答案:

答案 0 :(得分:47)

使用lambda函数时更短,如果使用C ++ 0x:

std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});

答案 1 :(得分:36)

查看std::for_eachstd::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;});