C++11 ではstd::array
、 に似た新しい がありboost::array
ます。例:
std::array<int, 5> fiveInts;
この新しい配列を 2 つの方法で使用したい場合:
- stack に配列を割り当てます。
- heap に配列を割り当てます。
構文的にそれを達成する方法は?5
それは変数にすることができますconst
か?
std::array<int, 5> fiveInts;
スタックに配列を割り当てます (自動ストレージ)。
std::array<int,5>* fiveInts = new std::array<int, 5>;
ヒープ (動的ストレージ) に配列を割り当てます。
はい、コンパイル時に値を知る必要があります。
テンプレートの引数は、コンパイル時に常に認識されている必要があります。a のサイズをstd::array
変数にすることはできません。
ヒープ上で連続した値のバッファを管理する最良の方法はstd::vector
、 を使用することです。これにより、バッファのサイズを実行時にサイジングできます。
std::array<int, 5> fiveInts;
スタック上に 5 つの要素の配列を作成します (自動ストレージ内)。 ヒープ (フリー ストア) にstd::vector<int> fiveInts(5);
5 秒のマネージ バッファーを作成します。int
std::array
を呼び出してヒープ上に完全に作成することもできますnew
が、私はそれをお勧めしません。 std::array
の主な利点は、スタックベース (または内部クラスベース) のストレージが可能になることです。
std::array<T, N>
N
タイプ のオブジェクトで構成されるテンプレートですT
。このタイプの自動オブジェクトを作成できます。
void f() {
std::array<int, 5> auto_ints;
}
オブジェクトには 5 つの int オブジェクトが含まれ、すべてスタック上にあります。
フリー ストアでこのタイプのオブジェクトを作成することもできます。
void g() {
std::array<int, 5> *free_store_ints = new std::array<int, 5>;
}
しかし、そうする理由はほとんどありませんstd::vector<int>
。
std::array
コンパイル時にサイズを指定する必要があります。std::vector
実行時にサイズを調整できます。