繁体   English   中英

将常量值添加到 std::vector 的 STL 方法

[英]STL way to add a constant value to a std::vector

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

std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);

将值 1.0 添加到每个元素?

如果在 STL 中没有一种很好的(例如简短、美观、易于阅读)的方法来做到这一点,那么 boost 怎么样?

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

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

看看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));

普通 C++0X 中最短的方法是:

for(double& d : myvec)
  d += 1.0;

并带有提升:

for_each(myvec, _1 += 1.0); // boost.range + boost.lambda
std::transform( myvec.begin(), myvec.end(), 
                myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );

如果您有兴趣对向量进行大量数学运算,您可能需要查看标准库的<valarray>部分。 它基本上是一个std::vector<>设计用于矢量数值计算(切片、数学函数、逐点运算符等)。

唯一真正糟糕的部分是它与std::vector<>转换并不容易。

最好的方法是添加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; });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM