118

次のような非常に単純な配列を作成したい場合

int myArray[3] = {1,2,3};

std::array代わりに使用する必要がありますか?

std::array<int, 3> a = {{1, 2, 3}};

通常のものよりも std::array を使用する利点は何ですか? より高性能ですか?コピー/アクセスの扱いが簡単ですか?

4

6 に答える 6

138

std::array通常のものよりも使用する利点は何ですか?

フレンドリーな値のセマンティクスを備えているため、値によって関数に渡したり、関数から返したりできます。そのインターフェイスにより、サイズの検索がより便利になり、STL スタイルの反復子ベースのアルゴリズムで使用できます。

より高性能ですか?

まったく同じである必要があります。定義上、これは配列を唯一のメンバーとして含む単純な集約です。

コピー/アクセスの扱いが簡単ですか?

はい。

于 2015-05-15T15:32:09.793 に答える
30

std::array他の C++ コンテナーのセマンティクスのような「通常の」値を与える C 配列用のゼロ オーバーヘッド ラッパーとして設計されています。

追加機能を楽しむことができる間は、ランタイム パフォーマンスの違いに気付かないはずです。

C++11 または boost が手元にある場合は、スタイル配列std::arrayの代わりに使用することをお勧めします。int[]

于 2015-05-15T15:31:45.240 に答える
12

std::arrayには値のセマンティクスがありますが、生の配列にはありません。std::arrayこれは、コピーしてプリミティブ値のように扱うことができることを意味します。関数の引数として値または参照で受け取ることができ、値で返すことができます。

をコピーしないstd::array場合、生の配列とパフォーマンスの違いはありません。コピーを作成する必要がある場合std::arrayは、正しいことを行い、同等のパフォーマンスが得られるはずです。

于 2015-05-15T15:33:08.800 に答える
0

これらのコードを実行する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なら使うべきだ。

于 2021-10-01T05:47:48.837 に答える