如何在C ++中返回2D矢量?

时间:2017-12-05 07:34:23

标签: c++ vector

vector <vector<int> > pasTriangleUsingVector(int A)
{
    vector <vector<int> > arr;
    for(int line=0;line<A;line++)
    {
        for(int i=0;i<=line;i++)
        {
            if(i==0 || line==i)
                arr[line][i]=1;
            else
                arr[line][i] = arr[line-1][i-1] + arr[line-1][i];

            //cout<<arr[line][i]<<" ";
        }
     }

     return arr;
}

我试图返回一个包含Pascal三角形的向量

它显示了细分错误

2 个答案:

答案 0 :(得分:1)

错误不是你想的那样。返回该向量没有错。错误是关于访问该向量。

考虑您的本地变量定义:

vector <vector<int> > arr;

开始时,arr是大小为0的向量,或向量。因此访问arr[0]是不可能的。 operator[]不执行边界检查。如果您尝试使用UB访问越界,它只会调用UB。现在你应该得到它: 所有 以后对arr的访问权限超出范围。

要确保有足够的空间,请使用std::vector::resize()

vector <vector<int> > arr;
/**********/
arr.resize(A);
for(int line=0;line<A;line++)
{
    arr[line].resize(line+1);
    for(int i=0;i<=line;i++)
    {
        /* Your stuff here */
    }
 }

答案 1 :(得分:0)

问题不在于你正在返回一个向量。问题是你试图访问arr [line] [i]而不为它分配内存。 这是数组(常量指针)int a[100];和向量std::vector<int> a;之间的区别,这种方式定义数组就足以在编译时为它分配内存,同时使用默认构造函数定义向量将分配no记忆吧。 所以这里有解决方案: 有许多方法可以为矢量分配和重新分配内存。 一种标准方法是在构造函数中:

vector<int> a(A, 0);

定义了一个带有10个索引的整数向量,默认值为0(但您不必提供默认值)。 在您的情况下,您可以使用以下

vector<int> temp(A);
vector<vector<int>> a(10, temp);

定义了10行的向量,每行有10列。 这就是你不需要的东西,因为矢量的宽度在所有行中是恒定的,所以让我们找到其他方法。 你应该做的第一件事是分配A行:

vector<vector<int>> arr(A);

然后你可以使用std::vector::push_back()成员函数而不是调用operator []。 这意味着

arr[line][i]=1;

应该成为

arr[line].push_back(1);

arr[line][i] = arr[line-1][i-1] + arr[line-1][i];

应该成为

arr[line].push_back(arr[line-1][i-1] + arr[line-1][i]).

请注意,对于您要添加的每个索引,在末尾附加一个元素,您将只使用此函数一次,然后您可以使用operator []从其索引中获取添加的元素,您始终可以使用{{1}获取向量中的元素数量。