用向量无处不在的随机值

时间:2017-02-07 21:20:40

标签: c++ matrix

我正在尝试用cpp制作一个矩阵图,结果证明这是一个很大的挑战。因此,为了制作矩阵,我使用了tewo嵌套向量:

>>> print s.encode('sloppy-cp1252').decode('utf8').encode('sloppy-cp1252').decode('utf8')
ラブライブ!スクールアイドルフェスティバル(スクフェス)

之后在cpp文件中我有这个:

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

使用第一个函数,我的目标是打印矩阵,在这种情况下,矩阵应始终包含0,它几乎可以,但结果如下:

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);
        }
}

由于某种原因,矩阵的第一个值是53,为什么会发生这种情况以及如何解决它?

PS。这不是完整的代码,看到一切,检查一下:

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

1 个答案:

答案 0 :(得分:2)

这是向量的越界访问:

(defun call (object function) (funcall function object))
(define-modify-macro callf (&rest args) call)

在最后一次迭代中,您正在访问超出范围的 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); });

此外,如果您使用std::vector::at()而不是Graph::Graph(int n) : matr(n, std::vector<int>(n)), number_vertc(n) {} ,则会抛出operator []异常而不是您的程序运行时发生未定义的行为。因此,你会(或应该)更早地发现问题。

std::out_of_range

要添加,我建议不要引入 matr.resize(n); for(int i=0;i<=n;i++){ matr.at(i).resize(n); // <-- std::out_of_range exception 之类的变量,因为number_vertc通过调用std::vector函数知道自己的大小。引入确定大小的无关变量只会在调整向量大小时遇到​​麻烦,而忘记更新该变量。