[英]C++ Variable-sized arrays using stdin and stdout
我正在嘗試在可變大小的數組上解決這個問題,但出現編譯錯誤。 不完全確定我哪里出錯了。
我的解決方案嘗試如下:
#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
返回對cin
的istream&
引用,它不會像您期望的那樣返回讀入elem
的int
值。 因此,您不能在對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){
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.