我正在尝试用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
答案 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
函数知道自己的大小。引入确定大小的无关变量只会在调整向量大小时遇到麻烦,而忘记更新该变量。