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

Han*_*ans 35 c++ stl

标准库中是否有一个算法可以为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_eachstd::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)

  • 这是一个快速的!:)我迟到了,所以让我放下http://www.cplusplus.com/reference/algorithm/transform/. (2认同)
  • 凉.也比我快.另外,正如页面所说,甚至比OP更快!"1分钟前问道","2分钟前回答" (2认同)
  • std::bind2nd 自 C++11 起已弃用,并将在 C++17 中移除。考虑`std::transform(myvec.begin(), myvec.end(), myvec.begin(), [&amp;](double x){x+1.0;});` (2认同)

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)


ltj*_*jax 9

std::transform( myvec.begin(), myvec.end(), 
                myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );
Run Code Online (Sandbox Code Playgroud)

  • 有趣的打字保护程序:感谢[Koenig Lookup](http://en.wikipedia.org/wiki/Koenig_lookup),您可以消除代码中除了最里面的`std ::`之外的所有内容,它仍然有效. (3认同)
  • 你打败了我 30 多岁,我已经删除了我的答案!:) (2认同)

And*_*ron 5

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

唯一真正糟糕的部分是它没有简单的转换std::vector<>.

  • @rubenvb:确实,它是库中最不为人知的部分之一。不幸的是,界面对于任何非数学的东西都很笨拙。标准礼让至少可以添加迭代器和范围构造函数,以便于与其他容器之间的转换。 (2认同)