2012-12-06 46 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