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

标签 c++ arrays multidimensional-array stdout stdin

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

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 的指针值(value)。

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

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

另外,关于这个声明:

smallarr[j] = cin>>elem;

表达式cin>>elem返回 istream&引用cin , 它不返回 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对于这两个任务,并摆脱其他变量。

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

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

或者:

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

关于使用标准输入和标准输出的 C++ 可变大小数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59402292/

相关文章:

php - 如何使用 PHP 将多维数组转换为单个数组?

c++ - 为什么我无法通过这种方式将转换字符串转换为C字符串?

python - 如何在 Python 中将数组(二维列表)分配给字典?

c++ - 有没有一种方法可以一次/多次处理一个数组的所有元素?

java - 如何用整数打印点数组?

Python:随机插入多行到3D numpy数组中

php - 如何在发布到 PHP 的 HTML 表单中使用数组格式的输入字段名称?

c++ - 关于 C++ 20 模块的困惑

c++ - 可以抑制一个功能的输出吗?

c++ - boost :asio. 从服务器下载镜像文件