5

我有一个代码如下:

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;

但我得到一个错误:数组的大小必须是常数。有没有办法避免它?

非常感谢你。

4

2 回答 2

12

std::array需要在编译时知道大小,这不适用于您的代码。所以不,你不能简单地std::vectorstd::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()获得一个在运行时确定的数字。

于 2012-12-06T08:52:14.460 回答
5

如果您想利用数组长度是运行时间常数这一事实来提高效率,那么您要做的是std::vector::reserve提前预留必要的空间,以在向量增长时保存任何重新分配——这应该使它几乎一样快array

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

或者,如果数组是函数的本地数组,则将数字作为参数传入。

于 2012-12-06T09:13:08.313 回答