2017-02-07 4 views
-4

Я пытаюсь сделать матричный граф с cpp, и получается, что это довольно chalange. Таким образом, чтобы сделать матрицу я использую tewo вложенных векторов:Случайное значение, исходящее из ниоткуда с вектором

class Graph{ 
     private: 
       vector<vector<int> > matr; 
       int number_vertc; 
     public: 
       Graph(int = 0); 
       void print_graph(); 
}; 

После этого в файле CPP у меня есть это:

void Graph::print_graph(){ 
     cout << "----------------------------" << endl; 
     for(int i=0;i<number_vertc;i++){ 
       for(int j=0; j < number_vertc; j++){ 
         cout << matr[i][j]; 
         cout << "|"; 
       } 
       cout << "|" << endl; 
     } 
} 
Graph::Graph(int n){ 
     number_vertc=n; 
     matr.resize(n); 
     for(int i=0;i<=n;i++){ 
       matr[i].resize(n); 
     } 
} 

С первой функции я стремлюсь напечатать матрицу, которая в вне случае всегда должен быть содержащий 0 и почти делает, но вот результат:

[email protected]:~/documents/github/fmi-fall-2016/dm/graphs/cpp> make 
g++ -c main.cpp 
g++ -c graph.cpp 
g++ main.o graph.o -o output 
[email protected]:~/documents/github/fmi-fall-2016/dm/graphs/cpp> ./output 
ahdhasd 
---------------------------- 
53|0|0|0|0|| 
0|0|0|0|0|| 
0|0|0|0|0|| 
0|0|0|0|0|| 
0|0|0|0|0|| 

по какой-то причине первое значение матрицы составляет 53, почему это происходит и как это исправить?

PS. это не полный код, чтобы увидеть все, проверить это:

https://github.com/martin-varbanov96/fmi-fall-2016/tree/master/dm/graphs/cpp

+1

пожалуйста ** производство ** [mcve]. Я не буду обращаться к внешнему источнику, чтобы исследовать вашу проблему. По теме: вы пробовали переходить через свой код с помощью отладчика? –

+2

Возможно, это не проблема, но в 'Graph :: Graph()', 'i <= n' должно быть' i aschepler

+0

Спасибо, асеплер, в этом была проблема, добавьте aswer – Harton

ответ

2

Это вне границ доступа вектора:

matr.resize(n); 
for(int i=0;i<=n;i++){ // <-- Loop goes to n, which is out-of-bounds 
     matr[i].resize(n); 

На последней итерации вы» доступ к matr[n], что выходит за пределы. Коррекция будет:

matr.resize(n); 
for(int i=0;i < n;i++){ 
     matr[i].resize(n); 

Вместо петли, вы могли бы сделать следующее:

matr = std::vector<std::vector<int>>(n, std::vector<int>(n)); 

Или:

matr.resize(n); 
std::for_each(matr.begin(), matr.end(), [&](auto& v){ v.resize(n); }); 

Или:

Graph::Graph(int n) : matr(n, std::vector<int>(n)), number_vertc(n) {} 

В дополнение, если вы использовали std::vector::at() ins tead из operator [], исключение было бы выбрано вместо вашей программы, запущенной с неопределенным поведением. Таким образом, вы (или должны были бы) обнаружить проблему гораздо раньше.

matr.resize(n); 
for(int i=0;i<=n;i++){ 
     matr.at(i).resize(n); // <-- std::out_of_range exception 

Чтобы добавить, я хотел бы предложить, чтобы не вводить такие переменные, как number_vertc, так как std::vector знает свой собственный размер, вызвав функцию vector::size(). Внедрение посторонних переменных, которые определяют размер, может привести к неприятностям, если вы измените размер вектора, и вы забудете обновить эту переменную.

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