用线性增加的值填充向量

时间:2019-03-11 13:05:30

标签: 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;
}

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

一个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

4 个答案:

答案 0 :(得分:4)

您可能要做的第一件事是切换为使用std::generatestd::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; });
}

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

答案 1 :(得分:3)

如果您有权使用C ++ 11,则可以将dispose与lambda一起使用:

std::generate

但是,在此用例中,几乎不需要注释中所述的向量。

答案 2 :(得分:1)

您可以定义具有pm.environment.set("uuid", "1eb253c"); 并转换为operator++的类型,并使用std::iota

float

如果您有权访问#include <algorithm> #include <vector> struct spacer { spacer(float scale, int count = 0) : scale(scale), count(count) {} spacer operator++(){ ++count; return *this; } operator float(){ return count * scale; } private: float scale; int count; }; int main() { std::vector<float> v(100); std::iota(v.begin(), v.end(), spacer(1.132)); } ,则可以使用该实例和boost::counting_iterator

boost

答案 3 :(得分:1)

如果您正在寻找类似matlab linspace之类的东西,它在C ++中不是直接可用的,但是编写一个函数可以很容易地做到这一点。喜欢:

std::vector<float> linspace(float start, float end, size_t points)
{
  std::vector<float> res(points);
  float step = (end - start) / (points - 1);
  size_t i = 0;
  for (auto& e : res)
  {
    e = start + step * i++;
  }
  return res;
}

然后您可以像使用它一样

int main()
{
  std::vector<float> v = linspace(1, 5, 6);

  for (auto f : v) std::cout << f << " ";
  std::cout << std::endl;

  return 0;
}

输出:

1 1.8 2.6 3.4 4.2 5