[英]segmentation fault using nested vectors
我偶然发现以下代码段在某个间隔内创建了一个随机数列表:
#include <vector>
#include <iostream>
#include <math.h>
struct gen_rand_pos{
double factor;
public:
gen_rand_pos(double r=1.0): factor(r/RAND_MAX)
{}
double operator()(){
return rand()*factor;
}
};
int main(){
int N = 5;
std::vector<double> result(N);
std::generate_n(std::back_inserter(result), N, gen_rand_pos(1.0));
std::cout << result[0] << std::endl;
}
它工作得很好。 我试图将这一步骤更进一步并做同样的事情,但是这次创建了一个随机单位矢量的列表(矢量),它们均匀地分布在球体上。 这是我的努力:
double l2_norm(std::vector<double> const& u) {
double accum = 0.;
for (double x : u) {
accum += x * x;
}
return sqrt(accum);
}
struct gen_rand_vec{
double factor;
public:
gen_rand_vec(): factor(2.0/RAND_MAX)
{}
std::vector<double> operator()(){
std::vector<double> result = {rand()*factor-1,rand()*factor-1,rand()*factor-1}; // uniform in each component
double norm = l2_norm(result);
std::transform(result.begin(), result.end(), result.begin(),
std::bind1st(std::multiplies<float>(),1/norm)); // normalize the vector
return result;
}
};
但是,如果我现在尝试以相同的方式构造它:
int main(){
int N = 5;
std::vector<std::vector<double>> result2(N);
std::generate_n(std::back_inserter(result2), N, gen_rand_vec());
std::cout << result2[0][0] <<std::endl;
}
我遇到了细分错误。 问题出在back_inserter还是我做错了什么? 我不知道。 我检查了单个向量的构造,它们工作得很好,所以此后的错误必须出在某个地方。
提前致谢。
索引<0,4>
result2
的内部向量的默认大小为0,因此您无法访问
result2[0][0] // inner vector doesn't keep any elements
当使用back_inserter
调用generate_n
时,会将新的向量添加到result2
的末尾。 在这种情况下,您可以访问result2[>=5]
的内部向量的索引。
您的问题很简单, std::back_inserter
在result2
的末尾插入新的向量。 因此,您无法访问第一个元素,因为它尚未初始化。 要解决此问题,只需从result2
的初始化中删除(N)
。 例子
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.