2016-09-11 17 views
0

200個の頂点で構成される隣接リストを作成しました。各ベクトルは行番号に対応しています.iはiとエッジを共有するすべての頂点を持っています。私は隣接リストから198のランダムなベクトルを削除したい。しかし、私はベクトルのベクトルからベクトルを削除するための良い方法である知りたかったセグメンテーションフォールトエラーベクトルのベクトルでベクトルを削除するC++

void contract_edge(vector<vector<int> >&adjacency_list , int pos) 
    { 
     adjacency_list.erase(adjacency_list.begin()+pos); 
    } 
    int main() 
    { 
     vector<vector<int> > adjacency_list(200); 
     int size = 200; 
     while(size > 2) 
     { 
      int random = rand()%200; 
      contract_edge(adjacency_list,random); 
      size--; 
     } 
     return 0; 
    } 

を取得しています。

+2

'int random = rand()%200;' ...いくつかの要素を削除した後にランダム値が範囲外になるとどうなりますか? –

+0

yupはそれをrand()%adjacency_list.size()に変更しました。 –

+0

そのトリックをした –

答えて

1

セグメンテーションエラーは、0から199までの乱数を選択し続けるという事実に起因しますが、adjacency_listベクトルのサイズは急激に減少しています。したがって、範囲外の値を選択すると時間がかかるだけです。 random

ソリューションはもちろんadjacency_list.size()-1に0からランダムに選択するだろうが、私はただランダムに、代わりに保つために2行を選んで、それらをコピーして、STDとして、全体adjacency_listを捨てる示唆::ベクトルは、あまりにも良いではありませんそれらのランダムな反復的な除去を伴う。

関連する問題