用线性增加的值填充向量

Nic*_*sui 2 c++ vector

我会用线性增加的值填充/初始化一个向量。例如,对于这个向量中的每个元素,我希望下一个元素a比前一个元素多。或者该kth元素的值为k*a

像这样的东西:

float a = 1.132;
vector<float> v(100);

for (int n = 0; n < 100; ++n)
{
    v[n] = n*a;
}
Run Code Online (Sandbox Code Playgroud)

有更优雅的方法吗?谢谢。

一个 Matlab 的例子是linspace(beginning value, end value, number of points)

linspace(1,5, 6)

ans =

    1.0000    1.8000    2.6000    3.4000    4.2000    5.0000
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 6

您可以做的第一件事就是改用std::generateorstd::generate_n代替 for 循环。该generate版本可能看起来像

int main()
{
    float a = 1.132;
    std::vector<float> v(100);
    std::generate(v.begin(), v.end(), [n = 0, &a]() mutable { return n++ * a; });
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是创建一个迭代器,它将在迭代时生成值。这样做的优点是您不需要v使用任何默认构造值进行初始化(这可能很昂贵)。然后使用向量范围构造函数,它将初始化所有元素。只要迭代器遵守前向迭代器要求,向量就会计算出所需的空间(如果不是随机访问会导致完整迭代),分配,然后初始化(完整迭代)。对于双迭代来说,这可能会很昂贵,因此它可能不会比生成情况更快,而且可能会更慢(因为零初始化非常快)。