3

ここでの答えは次のとおりです。

n2798 (C++0x のドラフト) より: ベクトルの要素は連続して格納されます。つまり、v が T が bool 以外の型のベクトルである場合、恒等式 &v[n] == &v[0 に従います。 ] + n for all 0 <= n < v.size()。

このプログラムは動作します:

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

int main(){
  int k;
  cin >> k; cout << endl << "k = " << k << endl;
  ostream_iterator<int> oi(cout, " ");
  vector<vector<int> > vpi;
  while(k--)
  {
    vpi.push_back(vector<int>(istream_iterator<int>(cin), istream_iterator<int>()));
    cin.clear();
    cout<<"k = "<< k <<endl;
    copy(vpi[vpi.size()-1].begin(), vpi[vpi.size()-1].end(), oi);
    cout<<endl;
  }
}

ベクトルの要素が同じサイズである必要があり、格納されるベクトルのサイズが事前にわからない場合、ベクトルはどのようにして連続してベクトルを格納できますか?

これが以前に尋ねられた場合は申し訳ありませんが、見つけることができませんでした。その場合は、リンクをドロップしてください。

4

2 に答える 2

3

Astd::vectorは小さい固定サイズのオブジェクトです。通常の実装には、3 つのポインター、または 1 つのポインターと 2 つの整数サイズ (現在のサイズと割り当てられた容量) が含まれます。ベクターの内容は、ベクター オブジェクト自体には保存されませんが、ベクターのアロケーター (デフォルトでは標準のヒープ アロケーター) を使用して割り当てられたメモリに保存されます。

したがって、ベクトルのベクトルは小さなオブジェクトであり、通常は 3 つのポインターのサイズです。その中にあるベクトルは、ヒープ内のどこかにある連続したメモリ内の小さなオブジェクトです。そして、これらの内部ベクトルの内容は、ヒープ内の別の場所にあります。

于 2012-12-22T17:59:17.000 に答える
0

ベクトルの要素はそれ自体ではなく、フリー ストアの一部のメモリにあるため、ベクトルは簡単に連続して格納できます。によって指定されるオブジェクトのサイズsizeofコンパイル時の定数式であり、それらは連続して格納されるビットです。

于 2012-12-22T17:42:26.067 に答える