1. ホーム
  2. c++

[解決済み] std::vectorの要素は連続であることが保証されていますか?

2022-07-25 15:58:39

質問

私の質問は単純です。 std::vector の要素は連続であることが保証されていますか? 言い換えれば、最初の要素へのポインタは std::vector の最初の要素へのポインタを C 配列として使用できますか?

私の記憶が正しければ、C++の標準はそのような保証はしていませんでした。 しかし std::vector の要件は、要素が連続していない場合、それを満たすことが事実上不可能なほどでした。

誰かこれを明確にしてくれませんか?

例を挙げます。

std::vector<int> values;
// ... fill up values

if( !values.empty() )
{
    int *array = &values[0];
    for( int i = 0; i < values.size(); ++i )
    {
        int v = array[i];
        // do something with 'v'
    }
}

どのように解決するのですか?

これは C++98 標準では見送られましたが、後に TR の一部として追加されました。近日公開される C++0x 標準は、もちろんこれを要件として含んでいます。

n2798 (C++0x のドラフト) から。

23.2.6 クラステンプレート ベクトル [vector]

1 ベクターはランダムアクセスのイテレータをサポートするシーケンスコンテナです。さらに、それは(償却された)サポートします。 途中の挿入と消去には線形時間がかかります。ストレージ ストレージの管理は自動的に行われるが、効率を上げるためのヒントを与えることができる。ベクトルの要素は つまり,vがベクトルで,Tがbool以外の型であれば つまり,vはTがbool以外の型であれば, &v[n] == &v[0] + n for all 0 <= n < v.size() という恒等式に従います.