我将使用线性增加的值填充/初始化一个向量。例如,对于此向量中的每个元素,我希望下一个比上一个多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
答案 0 :(得分:4)
您可能要做的第一件事是切换为使用std::generate
或std::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