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三角形的向量
它显示了细分错误
答案 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}获取向量中的元素数量。