使用标准输入和标准输出的 C++ 可变大小数组

C++ Variable-sized arrays using stdin and stdout

我正在尝试解决可变大小数组的这个问题,但我遇到了编译错误。不太确定哪里出错了。

Problem can be accessed in this PDF

我的解决方案尝试如下:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    int n,q,size,elem,index,smallindex;

    //input of n and q
    cin>>n>>q;

    //declare the array a 
    int* bigarr = new int[q];

    //assign the individual arrays to each element of the array a
    for (int i=0; i<n; ++i){
        //input of size of the individual array
        cin>>size;
        int* smallarr = new int[size];

        for (int j=0; j<size; ++j){
            smallarr[j] = cin>>elem;
        }
        bigarr[i] = smallarr;
    }

    //obtain index queries
    for (int k=0; k<n; ++k){
        cin>>index;
        cin>>smallindex;
        cout<<bigarr[index][smallindex];
    }

}

关于这个声明:

bigarr[i] = smallarr;

smallarr是一个int*指针,但是bigarr也是一个int*,即int的数组,所以bigarr[i]是单个int。您不能将 int* 指针分配给 int 值。

如果你想让bigarr成为一个指向其他数组的指针数组,你需要将bigarr声明为int**而不是int*,然后使用new int*[q]分配它。

int** bigarr = new int*[q];

另外,关于这个声明:

smallarr[j] = cin>>elem;

表达式 cin>>elem return 是对 cinistream& 引用,它不会 return 将 int 值读入 elem,如您所料。所以你不能在对 smallarr[j] 的赋值中直接使用该表达式的结果。您将必须阅读 elem 并在单独的语句中将其分配给 smallarr

cin>>elem;
smallarr[j] = elem;

也就是说,请注意您的代码泄漏了所有分配的数组,因为在任何地方都没有调用 delete[]。您需要添加它们:

int** bigarr = new int*[q];
...
for (int i=0; i<n; ++i){
    ...
    int* smallarr = new int[size];
    ...
    bigarr[i] = smallarr;
}
...
for (int i=0; i<n; ++i){
    delete[] bigarr[i]; // <-- here
}
delete[] bigarr; // <-- here

不过,你真的应该使用 std::vector 而不是手动使用 new[]/delete[](你已经有了 #include <vector>):

std::vector<std::vector<int> > bigarr(q);
...
for (int i=0; i<n; ++i){
    ...
    std::vector<int> smallarr(size);
    for (int j=0; j<size; ++j){
        ...
        smallarr[j] = elem;
    }
    bigarr[i] = smallarr;

    /* alternatively:
    bigarr[i].resize(size);
    for (int j=0; j<size; ++j){
        ...
        bigarr[i][j] = elem;
    }
    */
}

我还看到你用q分配bigarr,然后你用n循环bigarr。您不需要两个单独的变量。对这两个任务使用 nq,并去掉另一个变量。

除非你真的打算分配更多的插槽然后你想填充。在这种情况下,你的外循环需要确保它不超过 nq:

for (int i=0; (i<n) && (i<q); ++i){

或者:

for (int i=0; i<std::min(n,q); ++i){