【问题标题】:C++ 2D Vector got errorC++ 2D 向量出错
【发布时间】:2015-04-17 08:09:24
【问题描述】:
#include <string>
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

class matrix
{
 public:
    matrix(int);
    void func(int);
    vector<vector<double> > m;
};

matrix::matrix(int size)
{
    //set 3 X 3 = 9 elements to zero
    vector<vector<int> > m(size, vector<int>(size));

    // success
    cout << "test1 if m[0][0] equals to zero: " << m[0][0] << endl;
}

void matrix::func(int size)
{
    // failure, can't pass till here
    cout << "test2 if m[0][0] equals to zero: " << m[0][0] << endl;

    for(int i = 1; i != size; ++i)
    {
        m[i][i] = 0;
    }
}



int main()
{
    int input1 = 3;

    matrix mat(input1);

    mat.func(input1);
}

我想创建一个二维向量而不是使用数组。但是,我遇到了运行时错误。

我创建了一个vector&lt;vector&lt;int&gt; &gt; m(size, vector&lt;int&gt;(size)) 以确保vector 中的所有元素都等于0,并且我通过了test1。我无法通过我评论为“失败”的 test2。

【问题讨论】:

  • “test2”通过或失败意味着什么?
  • 请同时发布您的程序的确切错误输出。
  • 你不应该使用嵌套向量来表示 nD 数组,除了一些快速原型。看看Boost Multi-Array

标签: c++ c++11 vector


【解决方案1】:

在您的构造函数中,您正在创建一个局部变量m,并使用它。当然,它在 func 函数中不可用。为了使其工作,您需要初始化对象的成员变量m。此外,您在构造函数中创建的向量类型错误(int 而不是double

matrix::matrix(int size)
    : m(size, vector<double>(size)) //initializing the vector
{
}

【讨论】:

    【解决方案2】:

    建议:我不禁想到,如果您只是在内部将其存储为一个向量而不是向量的向量,它会更简单(并且可能在内部更紧凑)。即

    std::vector<double> m;
    size_t x;
    size_t y;
    

    这可能看起来不是二维的,但请记住,这是您的类的私有细节,这就是封装的用途。

    认为您遇到的问题是您在调整矢量大小之前尝试尊重矢量。当您创建一个向量时,您要么必须给它一个初始大小,要么将值推回它以增加大小。你可能想要做你可以做的前者:

    void matrix::resize( size_t x1, size_t y1 )
    {
        m.clear();
        x = x1;
        y = y1;
        m.resize( x * y );
    }
    

    然后您可以使用以下方法访问矩阵的单个元素:

    double matrix::get( size_t x1, size_t y1 )
    {
        return m[ x1 * x + y1 ];
    }
    

    【讨论】:

      【解决方案3】:

      基本上,你在构造函数中所做的是

      vector<vector<int> > m(size, vector<int>(size));
      

      m 在这里是一个局部变量。因此,它在构造函数之外不可用,因此在func() 中,您基本上是在尝试访问未初始化的向量。

      要解决这个问题,请在构造函数中初始化m,方法是将上述语句更改为:

      m = vector<vector<int> >(size, vector<int>(size));
      

      【讨论】:

      • 最好使用初始化列表来避免额外的复制操作。
      • 毫无疑问,但你确实提到了这一点。所以,我提到了一个替代方案。 :)
      • 谢谢!但我在更改后出现错误,“没有可行的重载'='”
      • 但这不是一个好的选择。而且它不是初始化。
      猜你喜欢
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 2015-12-06
      • 2020-02-02
      相关资源
      最近更新 更多