2016-09-11 2 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.

Решение, конечно, будет выбрать случайное от 0 до adjacency_list.size()-1, но я предлагаю просто случайно выбирать 2 строки, чтобы вместо того, чтобы, копируя их, а затем выбросить весь adjacency_list как станд :: вектор не слишком хорошо с этими случайными повторными удалениями.

Смежные вопросы