通过常量浮点值生成一系列递增的数字

时间:2015-06-05 11:33:35

标签: c++ c++11 std

我知道iota函数,但它只是工作整数值,因为它调用++运算符。

我想通过让0.5比较来生成增加的浮点数 [0.5,1,1.5 ....],并将它们插入我的载体

我想出的最终解决方案是:

    double last = 0;
    std::generate(out , out + 10, [&]{
        return last += 0.5; 
    }); 

哪种工作但我必须使用额外的变量。是否存在我失踪的标准功能,如“D语言”示例中的“iota”功能:auto rf = iota(0.0, 0.5, 0.1);

2 个答案:

答案 0 :(得分:3)

如果编译器支持C ++ 2014,则可以编写

double a[10];

std::generate( a, a + 10, 
              [step = 0.0] () mutable { return step += 0.5; } );

for ( double x : a ) std::cout << x << ' ';
std::cout << std::endl;

输出

0.5 1 1.5 2 2.5 3 3.5 4 4.5 5

那就是你可以使用init捕获而不在定义lambda的范围内声明一个额外的变量。

否则,您可以在lambda表达式中声明一个静态变量。例如

#include <iostream>
#include <algorithm>

int main() 
{
    double a[10];

    std::generate( a, a + 10, 
                  [] () mutable ->double { static double value; return value += 0.5; } );

    for ( double x : a ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

输出将是相同的

0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 

答案 1 :(得分:2)

您可以在iota之后使用transform

iota(begin(a), end(a), 0);    
const auto op = bind(multiplies<double>(), placeholders::_1, .5);
transform(begin(a), end(a), begin(a), op);

或者使用boost::counting_iterator

transform(boost::counting_iterator<int>(0),
          boost::counting_iterator<int>(n),
          begin(a),
          bind(multiplies<double>(), placeholders::_1, .5));