【问题标题】:C++ Variable-sized arrays using stdin and stdout使用标准输入和标准输出的 C++ 可变大小数组
【发布时间】:2019-12-19 01:45:58
【问题描述】:

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

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];
    }

}

【问题讨论】:

  • 使用std::vector解决问题。没有必要深入了解所有这些动态内存管理的杂草。您链接到的问题并不关心您使用什么底层结构,只要您能回答这个问题。请注意,使用 vector 并不能解决您所链接的问题 - 它确实让您可以专注于问题,而无需正确处理所有这些内存管理。跨度>
  • @PaulMcKenzie 知道了,谢谢!

标签: c++ arrays multidimensional-array stdout stdin


【解决方案1】:

关于此声明:

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&gt;&gt;elem 返回对cinistream&amp; 引用,它不返回读入elemint 值,就像您所期望的那样。因此,您不能直接在对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 &lt;vector&gt;):

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){

【讨论】:

  • 感谢您彻底消除我的误解。请问为什么下面的代码行 - int** bigarr = new int*[q] 是正确的,而 in ** bigarr = new int[q] 不是?
  • @Prav 我在回答中提到了这一点。去仔细阅读吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2021-10-20
  • 2013-09-18
  • 2012-02-23
  • 2017-05-16
  • 2010-10-29
  • 2013-06-13
相关资源
最近更新 更多