我是 cpp 领域的新手。 下面是我的 cpp 代码。当我使用在线 C++ 编译器时,以及 为什么会发生退出,分段错误以及我的代码有什么问题。 谢谢各位。
问题描述: 给定一个整数数组 arr,您需要为每个索引 i 计算除该索引处的整数之外的所有整数的乘积(即,除了 arr[i])。实现一个函数 arrayOfArrayProducts,它接受一个整数数组并返回一个产品数组。 在不使用除法的情况下求解并分析您的解决方案的时间和空间复杂性。
#include <iostream>
#include <vector>
using namespace std;
vector<long> arrayOfArrayProducts(const vector<int>& arr)
{
vector<long> res = {};
int n = arr.size();
// handles edge cases as well
if(n==0 || n==1){
return res;
}
int product;
// your code goes here
for(int i=0; i<n; i++){
product = 1;
for(int j=0; j<n; j++){
if(i!=j){
product = arr[j]*product;
}
res[i]=product;
}
}
return res;
}
int main() {
// vector initiallize
//vector<int> arr{8, 10, 2};
const vector<int> arr;
int n = arr.size();
vector<long> ans(n,0);
ans = arrayOfArrayProducts(arr);
for(int i=0; i<n; i++){
cout<< ans[i] <<' ';
}
return 0;
}
答案 0 :(得分:1)
这里是失败的地方:
res[i] = product;
原因是因为你像这样声明了 res:
vector<long> res = {};
所以您试图访问位于空向量的“单元格”long
处的 i
元素......这在 C++ 中是不允许的,结果是 undefined behavior>
修复它:
和主函数一样
std::vector<long> arrayOfArrayProducts(const std::vector<int>& arr)
{
int n = arr.size();
std::vector<long> res(n, 0);
....
答案 1 :(得分:0)
当您尝试读取数组的边界时通常会发生分段错误。您代码中的这个错误意味着您正在尝试从未分配的数组中读取/写入某些内容。如果仔细观察,res[i]=product
表示您从向量 res
访问元素。但是您还没有重新分配或插入的数据到其中。这就是分段错误的原因。
要解决此问题,请将 res
向量调整为 arr
的大小,以便该向量具有要访问的内存中的元素,
vector<long> arrayOfArrayProducts(const vector<int>& arr)
{
vector<long> res(srr.size());
...
答案 2 :(得分:0)
您收到此错误是因为您试图访问您从未初始化的 i
的索引 vector<int> res
。在这一行:
res[i] = product;
为此,您必须了解 Vector 的工作原理,Vector 是动态容器,可以根据其使用情况进行收缩和扩展,在您的情况下,您使用默认构造函数对其进行初始化,该构造函数没有分配任何内存来保存 {{1} }.因此,当您尝试访问它时,您会得到未定义的行为。
在默认构造向量的情况下。您不能分配给特定索引。但是您可以通过以下方式将数据放入其中:
int
您可以使用这些构造函数来修复它:
res.push_back(data);