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 に答える