次のような非常に単純な配列を作成したい場合
int myArray[3] = {1,2,3};
std::array
代わりに使用する必要がありますか?
std::array<int, 3> a = {{1, 2, 3}};
通常のものよりも std::array を使用する利点は何ですか? より高性能ですか?コピー/アクセスの扱いが簡単ですか?
std::array
通常のものよりも使用する利点は何ですか?
フレンドリーな値のセマンティクスを備えているため、値によって関数に渡したり、関数から返したりできます。そのインターフェイスにより、サイズの検索がより便利になり、STL スタイルの反復子ベースのアルゴリズムで使用できます。
より高性能ですか?
まったく同じである必要があります。定義上、これは配列を唯一のメンバーとして含む単純な集約です。
コピー/アクセスの扱いが簡単ですか?
はい。
std::array
他の C++ コンテナーのセマンティクスのような「通常の」値を与える C 配列用のゼロ オーバーヘッド ラッパーとして設計されています。
追加機能を楽しむことができる間は、ランタイム パフォーマンスの違いに気付かないはずです。
C++11 または boost が手元にある場合は、スタイル配列std::array
の代わりに使用することをお勧めします。int[]
std::array
には値のセマンティクスがありますが、生の配列にはありません。std::array
これは、コピーしてプリミティブ値のように扱うことができることを意味します。関数の引数として値または参照で受け取ることができ、値で返すことができます。
をコピーしないstd::array
場合、生の配列とパフォーマンスの違いはありません。コピーを作成する必要がある場合std::array
は、正しいことを行い、同等のパフォーマンスが得られるはずです。
これらのコードを実行するstd::array
と、 とを使用して同じパフォーマンス結果が得られます。c array
std::array<QPair<int, int>, 9> *m_array=new std::array<QPair<int, int>, 9>();
QPair<int, int> *carr=new QPair<int, int>[10];
QElapsedTimer timer;
timer.start();
for (int j=0; j<1000000000; j++)
{
for (int i=0; i<9; i++)
{
m_array->operator[](i).first=i+j;
m_array->operator[](i).second=j-i;
}
}
qDebug() << "std::array<QPair<int, int>" << timer.elapsed() << "milliseconds";
timer.start();
for (int j=0; j<1000000000; j++)
{
for (int i=0; i<9; i++)
{
carr[i].first=i+j;
carr[i].second=j-i;
}
}
qDebug() << "QPair<int, int> took" << timer.elapsed() << "milliseconds";
return 0;
次の結果が得られます。
std::array<QPair<int, int> 5670 milliseconds
QPair<int, int> took 5638 milliseconds
マイク・シーモアの言う通り、使えるstd::array
なら使うべきだ。