2017-12-27 68 views
1

當我需要在C++中存儲多個相同類型的值時,我可以使用一個向量或數組。到目前爲止,我主要只使用向量,但我聽說數組處理速度更快(讀取和寫入值)。如果這是真的,我想知道如何用標準輸入讀取的大小來創建一個數組。我目前使用的是這樣的:C++從標準輸入初始化一個大小的數組

int N; 
cin >> N; 
vector<int> myVector(N); 

我曾嘗試:

int N; 
cin >> N; 
array<int, N> myArray; 

,但是這給了我一個錯誤,因爲:
錯誤:的「N」的值不是一個常量表達式可用
我也曾嘗試:

int N; 
cin >> N; 
int myArray[N]; 

這將編譯,但是當我試着問這個ARRA的大小Y(myArray.size())遍歷它與一個for循環然後我得到一個錯誤:
錯誤:會員「尺寸」在「myArray的」,請求其是非類型的「INT [N]」

所以我應該用數組替換向量來使我的代碼更快,如果是的話我應該怎麼做呢?

+1

***我應該用數組替換向量,使我的代碼更快***不,你需要一個動態數組,所以使用一個向量。 – drescherjm

+2

'std :: array'的速度優勢(及其基於堆棧的對象的大小限制)來自這樣一個事實,即std :: array的大小在編譯時是已知的,因此它可以避免分配和更重要的是間接的。可能有一個類似std :: array的數據結構的地方,它具有已知的大小上限,但動態大小高達此上限。但是,標準C++庫中沒有這樣的數據結構。 –

+1

'int myArray [N];'是一個VLA。這不是合法的C++,而是一個編譯器擴展。無論如何,我懷疑它比矢量更快,它使你的代碼只能在支持這種非標準擴展的編譯器上工作。 – drescherjm

回答

1

N應該在編譯時知道。因此,如果您想要使用array進行I/O操作,則應指定允許讀取的最大數量int。另外,您應該自行跟蹤讀取整數的數量。

So should I replace vectors with arrays to make my code faster and if so the how should I do it?

不,因爲operator>>將是您的情況的瓶頸。並且當int s的數字未知時,與vector一起工作就好了。

0

數組不是C++中的對象,所以沒有.size()函數。你應該讓另一個變量保持它的大小。

int* array = new int[size]; 

就是這樣。但是,你應該有充足的理由來做這件事,因爲它更安全,更易於使用。使用數組

後,必須將其刪除:

delete [] array; 

,並記住你永遠可以使用矢量:: data()函數得到一個向量數組

+3

其他一切都很好......但是我對最後一點低估了,這是危險的錯誤。這甚至編譯?它不應該,因爲這不是一個有效的隱式演員。無論如何,'std :: vector'不會提供一個重載的'operator&'來訪問它的緩衝區,也不應該這樣做。 (A)我不知道如何和(B)你需要立即替換該代碼,因爲它不應該工作,並且可能在任何時候爆炸。 –

+0

@underscore_d我認爲他的意思是'vector :: data()'函數。這實際上是一個指向底層數據數組的指針。 http://en.cppreference.com/w/cpp/container/vector/data – DNK

+1

正確,-1被刪除。當然,這個底層數組是由'vector'管理的,所以我們不能將其替換爲所有使用原始數組的情況,特別是如果它們可能試圖「刪除」它。我認爲最好只使用'.data()'傳遞給需要原始指針的API,最好是隻讀的'const'。其他任何事情都是在尋求麻煩,並且有些挫敗了使用vector的觀點。儘管如此,在某些情況下可以方便地使用'.data()'並寫入,但我認爲它們最好侷限於創建'vector'並維護其大小的人。 –