Перезапись вектора‹вектор‹› › и ошибка сегментации

Я пытаюсь написать программу, в которой на каждом шаге цикла я создаю список смежности, представляющий график, который изменяется во времени. Вот код:

#include <iostream>                                              
#include <fstream>         
#include <string>           
#include <sstream>         
#include <vector>         
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>                                           
#include <boost/random/mersenne_twister.hpp>                  
#include <boost/random/variate_generator.hpp>                 
#include <boost/random/uniform_int.hpp>                        
#include <boost/random/uniform_real.hpp>
#include <boost/random/exponential_distribution.hpp>

using namespace std;
using std::vector;

 typedef boost::mt19937_64 ENG; // use Mersenne Twister 19937 as PRNG engine
 typedef boost::uniform_int<> DIST_INT; // define uniform distribution of integers
 typedef boost::uniform_real<> DIST_REAL; // define uniform distribution of reals on [0,1)
 typedef boost::exponential_distribution<> DIST_EXP; // define exponential distribution
 typedef boost::variate_generator<ENG,DIST_INT> VARIATE_INT;
 typedef boost::variate_generator<ENG,DIST_REAL> VARIATE_REAL;
 typedef boost::variate_generator<ENG,DIST_EXP> VARIATE_EXP;

int main()
{  
 const unsigned int random_seed = time(NULL);
 // ======= initialize BOOST machines
 ENG eng(random_seed);
 DIST_INT dist_int;
 DIST_REAL dist_rand(0,1);
 DIST_EXP dist_exp;
 VARIATE_INT randint(eng,dist_int); //random integer. use as: randint(N)
 VARIATE_REAL rand(eng,dist_rand); //random float on [0,1[. use as: rand()
 VARIATE_EXP randexp(eng,dist_exp); //random exponentially distributed float.
 int N = 500, Tmax=200000, v, w;
 float p = 0.2, s;
 vector<vector<int> > contact_list;
 for(int i = 0; i < 200000; i++)
 {
  contact_list.resize(N, vector<int>());
  v = 1;
  w = -1;
  while(v < N)
    {
      s = rand();
      w += 1 + int(log(1-s)/log(1-p));
      while((w >= v) && (v < N))
       {
        w = w - v;
        v += 1;
       }
      if (v < N)
       {
        contact_list[v].push_back(w);
        contact_list[w].push_back(v);
       }
    }
 }
}

Однако в какой-то момент я получаю ошибку сегментации. На самом деле я думаю, что это не может быть правильным способом перезаписать вектор. Также добавлю, что хотелось бы менять N_nodes на каждом шаге. Любая помощь приветствуется!


person Francesco    schedule 30.11.2016    source источник
comment
Вы создаете новый вектор векторов каждый раз в цикле. Я не понимаю, как это идет вам на пользу. По-видимому, у N_nodes такая же проблема. Возможно, вам следует объявить эти переменные в более широком контексте, например вне цикла?   -  person Cody Gray    schedule 30.11.2016
comment
Проблема где-то в коде, который вы не опубликовали.   -  person molbdnilo    schedule 30.11.2016
comment
Добро пожаловать в Stack Overflow. Прочтите это, чтобы узнать, как опубликовать минимальный и полный пример   -  person UKMonkey    schedule 30.11.2016
comment
Спасибо за все ваши ответы, я добавил минимальный и полный пример и сделал несколько небольших модификаций, но все равно получаю ошибку сегментации!   -  person Francesco    schedule 30.11.2016
comment
Попробуйте получить доступ к вектору, используя .at(), или предоставьте valgrind переключатели, чтобы указать строку с ошибкой. (скомпилировать с -g).   -  person Erik Alapää    schedule 30.11.2016
comment
Спасибо @ErikAlapää за совет. Я обнаружил проблему: иногда rand дает 1, что нехорошо, потому что в журнале выдается 0!   -  person Francesco    schedule 30.11.2016


Ответы (1)


Для части ошибки сегментации вы можете использовать Valgrind, чтобы попытаться выяснить, какая операция в вашем коде записывает в недопустимое место. .

Также вы можете поймать ошибку сегментации с использованием сигнала, но не рекомендуется ловить ошибку сегментации.

person raphael chriqui    schedule 30.11.2016