簡體   English   中英

嵌套向量的分割錯誤

[英]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_inserterresult2的末尾插入新的向量。 因此,您無法訪問第一個元素,因為它尚未初始化。 要解決此問題,只需從result2的初始化中刪除(N) 例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM