【问题标题】:Vector size() returning seemingly random large integers向量大小()返回看似随机的大整数
【发布时间】:2014-12-10 01:24:09
【问题描述】:

我正在编写一个家庭作业程序,但遇到了一个奇怪的问题。当尝试使用 size() 函数获取 2D 向量的大小时,我得到看似随机的大整数,这会阻止我的程序运行。我需要大小才能访问向量中的元素。

我的头文件:

#ifndef _MATRIX_H
#define _MATRIX_H
#include <iostream>
#include <vector>

class Matrix {

    private:
        //int dimension;

        std::vector< std::vector<int> > matrix;

    public:

        Matrix();

        Matrix(std::vector< std::vector<int> >);

        void print();

        Matrix operator-(Matrix operand);

};

#endif

我的实现文件:

#include "Matrix.h"
#include <iostream>
#include <vector>

// Default constructor
Matrix::Matrix() {

}

// Parameterized constructor
Matrix::Matrix(std::vector< std::vector<int> >) {

}

void Matrix::print() {
    std::cout << "Size of matrix in print() " << matrix.size() << std::endl;
    for (int i = 0; i < matrix.size(); i++) {
        for (int j = 0; j < matrix.size(); j++) {
                std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

Matrix Matrix::operator-(Matrix operand) {

    Matrix difference;
    std::vector< std::vector<int> > diffMatrix;

    diffMatrix.resize(matrix.size());

    for (int i = 0; i < matrix.size(); i++ ) {
        diffMatrix[i].resize(matrix.size());
    }

    difference.matrix = diffMatrix;
    if (operand.matrix.size() == matrix.size()) {

        for (int i = 0; i < operand.matrix.size(); i++) {
            for (int j = 0; j < operand.matrix.size(); j++) {
                difference.matrix[i][j] = matrix[i][j] - operand.matrix[i][j];
            }
        }   
    } 
}

还有我的 main.cpp 文件:

#include "Matrix.h"
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv) {

    vector< vector<int> > testMatrixOne(4);
    vector< vector<int> > testMatrixTwo(4);

    // Creating a test matrix
    testMatrixOne = {{1,2},{3,4}};
    testMatrixTwo = {{5,6},{7,8}};

    // Create Matrix object
    Matrix matrixOne(testMatrixOne);
    Matrix matrixTwo(testMatrixTwo);

    // Create Matrix to store difference
    Matrix diff;
    diff = matrixOne - matrixTwo;
    diff.print();


    return 0;
}

我已经简化了我的代码并在两个矩阵中进行了硬编码。运行程序时,size() 将返回一个非常大的整数。我花了几个小时在网上搜索,但找不到原因。为什么 size() 函数会这样做?

【问题讨论】:

  • Matrix 的构造函数从不初始化dimension
  • Matrix::Matrix(std::vector&lt; std::vector&lt;int&gt; &gt;) 将矩阵留空,这就是您使用的构造函数。
  • 这段代码中还有几个地方应该使用j &lt; matrix[i].size()作为终止限制,而不是j &lt; matrix.size()
  • @Adam 整个代码假定为方阵,这本身不应该导致问题
  • 是的,operator- 缺少 return -- 你的编译器没有抱怨吗?

标签: c++ vector operator-overloading


【解决方案1】:

不幸的是:

Matrix Matrix::operator-(Matrix operand) {

从不返回值。这会导致未定义的行为,您看到的症状是 - 似乎返回垃圾的结果。

在函数结束时,你的意思是:

    return difference;
}

C++ 标准不要求编译器对此发出警告,但如果他们发出警告仍然很好。我的 g++ 版本没有(即使使用 -Wall),但是添加标志 -Wreturn-type 确实会产生警告。 IDK 为什么这不是-Wall 的一部分,至少对于像这样的简单情况。

【讨论】:

  • 这修复了它!我还是 C++ 新手,你能解释一下 -Wall 是什么吗?
  • -Wall 是一个编译器开关,用于启用“所有”警告(实际上:一组常见的警告)。 g++ 和 clang 对编译器警告使用相同的语法。查看您的编译器文档以获取有关启用警告的更多信息。
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多