使用嵌套向量的分段错误

时间:2018-01-26 11:33:38

标签: c++ vector random

我偶然发现了以下代码段,以便在某个时间间隔内创建一个随机数列表:

#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还是我做错了什么?我弄不清楚。我检查了单个向量的构造,它们工作得很好,所以错误必须在那之后的某个地方。

提前致谢。

2 个答案:

答案 0 :(得分:0)

索引result2的{​​{1}}内部向量的默认大小为0,因此无法访问

<0,4>

当您使用result2[0][0] // inner vector doesn't keep any elements 致电generate_n时,您会在back_inserter的末尾添加新的向量。在这种情况下,您可以访问result2的内部向量索引。

答案 1 :(得分:0)

您的问题非常简单,std::back_inserter正在result2的末尾插入新的向量。因此,您无法访问第一个元素,因为它未初始化。要解决此问题,只需从(N)的初始化中删除result2即可。 Example