18

記憶はstd::array連続していますか?次の有効/グッドプラクティスはありますか?

std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];

ptr次に、cスタイルの配列を期待する関数に渡すことができますか?

4

2 に答える 2

32

はい、基本的に(そして実際には)atype arr[10];であるため、連続していますが、STLのようなインターフェイスを備えています。それはまた、わずかな挑発の指針に衰えることもありません。

&arr[0]Cスタイルの配列を期待する関数に安全に渡すことができます。これがその設計目標です。ただし、STLアルゴリズムで使用するには、beginandend関数を使用するだけです。

// either members
std::sort(arr.begin(), arr.end());
// or free from <iterator>
std::sort(std::begin(arr), std::end(arr));

言語弁護士の部分については、§23.3.2.1 [array.overview] p1

ヘッダー<array>は、オブジェクトの固定サイズのシーケンスを格納するためのクラステンプレートを定義します。配列はランダムアクセスイテレータをサポートします。のインスタンスは、タイプの要素をarray<T, N>格納するため、不変です。anの要素は連続して保存されます。つまり、がtheの場合、すべてののIDに従います。NTsize() == Narrayaarray<T, N>&a[n] == &a[0] + n0 <= n < N

そして§23.3.2.1 [array.overview] p2

配列は、構文で初期化できる集合体(8.5.1)です。

  • array<T, N> a = { イニシャライザリスト };

また、でp3、のメンバーを一覧表示しstd::arrayます。

T elems[N]; // exposition only
[注:メンバー変数は、クラスの集合体であるelemsことを強調するために、説明のためにのみ示されています。array名前はのインターフェースのelems一部ではありません。—エンドノート]array

于 2011-07-09T05:21:19.820 に答える
-1

はい、の記憶std::arrayは連続しています。VC10では、次のように宣言されています。

template<class _Ty,
    size_t _Size>
    class array
    { // fixed size array of values
                ... 
         _Ty _Elems[_Size == 0 ? 1 : _Size];
    };

与え_Elemesられたタイプの単純な配列に他なりません。

于 2011-07-09T05:36:16.923 に答える