用'std :: array`替换`std :: vector`

时间:2012-12-06 08:50:43

标签: c++ arrays vector c++11

我的代码如下:

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::vector替换为std::array? 而且,在肯定的情况下,我应该期望在效率方面获得收益吗?

我尝试用

替换矢量声明
 std::array<my_struct,n> my_array;

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

非常感谢。

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:5)

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

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

或者,如果数组是函数的局部数据,则将数字作为参数传入。