2012-12-06 85 views
5

我有一個代碼如下:與性病``替換的std :: VECTOR` :: array`

int n; 

int get_the_number(); 
void some_computations(); 

int main() 
{ 
    n = get_the_number(); 
    some_computations() 

    return(0); 
} 
  • get_the_number功能得到一些輸入,並返回整數n,其中它的呼叫後將不會被修改。

  • some_computation功能有以下代碼

    std::vector<my_struct> my_array; 
    
    for(int i=0; i<n; i++) 
    { 
        my_struct struct_temp; 
    
        // fill struct_temp; 
    
        my_array.push_back(struct_temp); 
    } 
    

問題:由於my_array大小是已知的先驗,是有可能替換std::vectorstd::array? 此外,在肯定的情況下,我應該期望效率方面的收益嗎?

我試着用

std::array<my_struct,n> my_array; 

更換載體的聲明,但是我得到一個錯誤:數組的大小必須是恆定的。 有沒有辦法避免它?

非常感謝。

回答

11

std::array需要知道的大小在編譯時間,這不適用於您的代碼。所以不,你不能簡單地用替換std::array這裏,除非get_the_number()可以返回constexpr例如。

constexpr int get_the_number() { return 42; } 

int main() 
{ 
    std::array<int, get_the_number()> a; 
} 

但想必你的情況int get_the_number()獲得在運行時確定的數字。

+0

看起來像我不夠快輸入。 :) –

+0

非常感謝您的快速和明確的答案。我以前不知道constexpr:我有很多東西要學習! – 888

5

如果你想用一個事實,即你的數組長度是運行時間不變提高效率,你想做的事就是用std::vector::reserve預留必要的空間提前保存任何隨着矢量的增長重新分配 - 這應該使其幾乎與array一樣快。

my_array.reserve(get_the_number()); 
some_computations() 

或者,如果數組是本地函數,則傳入數字作爲參數。

+0

「std :: vector :: reserve」不會像'std :: array'那麼快,原因是它將被分配到堆而不是棧中。一個用於'std :: vector'的堆棧分配器可能會使它幾乎達到'std :: array',儘管它需要進行基準測試。 – Ricky65