2017-09-03 60 views
-7

我見過大量的教程和線程,但沒有人這樣做來調整數組的大小。我的問題是,這是否會影響我的程序中的不良內容,還是有更好的方法來調整它?調整數組大小,這個代碼是否會以任何方式影響它?

//GOAL:Array to become {1,2,4,5,6,7,8,9} 
    int size=9; 
    int array[size] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

    for (int i = 2; i < 8; ++i) 
     array[i] = array[i + 1]; 

//ARRAY IS NOW{1, 2, 4, 5, 6, 7, 8, 9, 9} 
//GOAL: TO DELETE THAT LAST 9 FROM ARRAY 
    size=8; 
    array[size]; 
//IT SHOULD BE {1,2,4,5,6,7,8,9} now, but does it effect my program in any negative context? 
+7

數組並不打算調整大小。如果你想調整大小,使用例如std :: vector。 – Philipp

+4

此外,'size'甚至不是編譯時間常量,所以這甚至不能編譯。 –

+4

爲什麼你認爲最後一行會調整數組大小? – MikeMB

回答

2

int array[size]聲明大小元素的數組。 在聲明之外,array[size]訪問數組中的元素大小。它不調整數組的大小。如果您在不更改大小值的情況下執行此操作,則實際上會嘗試訪問數組中最後一個元素之後的元素;不是一個好主意。在這種情況下,由於您將大小更改爲比原始大小小1,因此它會訪問數組的最後一個元素,這是安全的,但不會按照您的要求進行。

您無法調整在堆棧中聲明的C/C++中的數組大小(在malloc中分配的堆可以重新分配給不同的大小,但是您將無法將其複製爲新分配的數組新的尺寸可能位於完全不同的內存位置;您必須保存舊的尺寸,分配新的尺寸,複製所需的元素,然後釋放舊的尺寸。)

If你想要調整大小,你在C++中;使用一個容器(例如,矢量,但選擇一個最適合您需要的容器)。

而且......我剛剛看到了arnav-borborah的評論;不知道我是如何錯過的。你甚至不能像這樣聲明數組,因爲size不是一個編譯時間常量。

+0

哦,是的,我明白了。「它實際上試圖訪問數組中最後一個元素之後的元素。」 這就是我需要的。 好的,這只是一個問題,因爲我想知道我是否應該學習矢量。謝謝! –

+0

不,它只是訪問最後一個元素,因爲8是最後一個索引 –

+0

@ArnavBorborah,對,因爲「大小」的值已更改。我會編輯。 – Basya

2

直到size變量不是constexpr,這

int size=9; 
int array[size] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

Variable length array,這不是標準,只有延長一些編譯器的一部分。

另外自動數組不能調整大小,它們自聲明以來一直具有固定的大小,直到它們超出範圍。

您應該使用一些STL容器,如std::array,std::vector

std::array需要知道在編譯時的大小,所以最好方法,std::vector,這是易於使用和調整大小。

// #include<vector> 

std::vector<int> array { 1,2,3,4,5,6,7,8,9 }; // Uniform initialization 

// Remove last element 
array.pop_back(); // 'array' has now only 8 elements (1..8) 

編輯

正如評論所說,如果你想刪除矢量n個元素,你可以做

array.erase(array.begin()+n); 

和工作已經完成。

+0

在這種情況下,OP可以使用'array.erase(array.begin()+ 2)'。 – Persixty

相關問題