29

古い標準std::vector<T>std::vector<bool>新しい.C++03C++11

これに対処し、標準を引用する素敵なスタックオーバーフローの質問:answeranswer

ネストされた vector 内のデータはどうなりますstd::vector <std::vector <T> >か? それはどのように保存されていますか?

すべての内部ベクトルがそのデータを連続して格納する必要がある場合、どうすれば&v[n] == &v[0] + n for all 0 <= n < v.size().

これを少し異なる言い方をすると、そのようなネストされた構造に格納されているすべての要素に、1-D ベクトルに対して実行できるのと同じ方法で「単純に」(ポインターなどを介して) 順番にアクセスすることは可能ですか?

4

4 に答える 4

33

いいえ。a の要素はvector、動的に割り当てられたメモリ ブロックに格納されます。そうしないと、 の容量をvector増やすことができません。vectorオブジェクトは、そのブロックへのポインターを保持するだけです 。

要素を順番に格納するという要件は、要素自体にのみ適用され、それらの要素の動的に割り当てられたメンバーには適用されません。

于 2012-06-05T13:19:48.780 に答える
8

最後の質問に答えるには: いいえ。ベクトルのベクトルの要素は連続して格納されません。

次のコードを検討してください。

std::vector<std::vector<int> > vv;
.... fill in v[0], v[1], v[2], etc
std::vector <int> & v = vv[1];
v.push_back (23);

それらがすべて連続して格納されている場合、vv[2]、vv[3] などの各要素が移動します。単一のベクトル「v」に影響を与えているだけなので、それはどのように機能しますか?

于 2012-06-05T13:21:10.717 に答える
5

std::vector< std::vector<T> >メモリの連続ブロックに格納されるオブジェクトのベクトルです。ただし、これらのオブジェクトもベクトルであるという事実は関係ありません。

ベクトルの要素はメモリの連続したブロックに格納されますが、要素が存在するメモリはベクトル オブジェクト自体の一部ではありません。

「そのようなネストされた構造に格納されているすべての要素に、1-D ベクトルに対して実行できるのと同じ方法で、(ポインターなどを介して) 「単純に」かつ順次にアクセスすることは可能ですか?」
の要素にアクセスするには、最初の要素のアドレスを取得してポインター演算を使用するよりも、またはstd::vectorを使用する方が適切ベクトルのベクトルとして表される多次元配列については、使いやすく読みやすい. vector::at と vector::operator[]も見る価値があります:)operator[]at()operator[]myVector[i][j]

于 2012-06-05T13:20:56.793 に答える
3

このようなネストされた構造に格納されているすべての要素に、1-D ベクトルに対して実行できるのと同じ方法で、「単純に」かつ順次 (ポインターなどを介して) アクセスすることは可能ですか?

はい、次の場合:

  • ベクトルのベクトルの最後に何かを追加するだけで済みます。

  • vector of vector コンストラクトをカスタム データ構造に置き換えても構わない

次にできることは、これらのすべてのサブベクトルを単一の連続したバッファーに連結し、別のインデックスバッファーを使用してトップレベルのエントリインデックスによってこれにアクセスすることです。

これに関する詳細な説明については、こちらの記事と、「折りたたみベクトル ベクトル」クラスの実装例を参照してください。

于 2013-11-26T14:00:55.233 に答える