簡體   English   中英

使用標准輸入和標准輸出的 C++ 可變大小數組

[英]C++ Variable-sized arrays using stdin and stdout

我正在嘗試在可變大小的數組上解決這個問題,但出現編譯錯誤。 不完全確定我哪里出錯了。

可以在此 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返回對cinistream&引用,它不會像您期望的那樣返回讀入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 <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){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM