使用标准输入和标准输出的 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 是对 cin
的 istream&
引用,它不会 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
。您不需要两个单独的变量。对这两个任务使用 n
或 q
,并去掉另一个变量。
除非你真的打算分配更多的插槽然后你想填充。在这种情况下,你的外循环需要确保它不超过 n
和 q
:
for (int i=0; (i<n) && (i<q); ++i){
或者:
for (int i=0; i<std::min(n,q); ++i){
我正在尝试解决可变大小数组的这个问题,但我遇到了编译错误。不太确定哪里出错了。
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 是对 cin
的 istream&
引用,它不会 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
。您不需要两个单独的变量。对这两个任务使用 n
或 q
,并去掉另一个变量。
除非你真的打算分配更多的插槽然后你想填充。在这种情况下,你的外循环需要确保它不超过 n
和 q
:
for (int i=0; (i<n) && (i<q); ++i){
或者:
for (int i=0; i<std::min(n,q); ++i){