0
vector<int> v;
v.push_back(0); //you have to do this
//v[0] = 0;     //this gives you an error
v[0] = 1000000; //but now you can set it

では、最初にベクトルを初期化するときに push_back を実行する必要があり、その後は設定するだけでよいのはなぜでしょうか? int などのプリミティブ型の場合、int i = 0; を実行できます。初期化用。

4

6 に答える 6

5

ベクトルのサイズが事前にわかっている場合は、push_back()の単純なシーケンスを使用しないでください。ベクトルが大きい場合(たとえば、512要素を超える場合)に再割り当てするのは時間の無駄になる可能性があります。

より良いこと:

オプション1:事前割り当てとプッシュ

vector<int> v;
v.reserve(N); // N is the expected size, but right now [0] is undefined. 
for (...) { 
  v.push_back(...);  // No problems in adding more than N elements, but may have to reallocate.        
}

オプション2:サイズ変更と充填

vector<int> v;
v.resize(N);
for (size_t i=0;i<N;i++)
  v[i] = ...; // You can't write past N-1 here!

オプション3:正しいサイズで直接作成してから、塗りつぶします

vector<int> v(N);
for (size_t i=0;i<N;i++)
  v[i] = ...; // You can't write past N-1 here!

オプション4:正しいサイズでベクトルを作成し、固定値に初期化します

vector<int> v(N,val); // v[0:N-1] are all equal to val
于 2013-03-06T17:07:43.283 に答える
4

最初にベクターを作成したときは空で、vector[0]存在しないためです。push_backベクトルに要素を追加すると、それを変更または読み取ることができますvector[i]

于 2013-03-06T03:54:14.520 に答える
3

すべてを100%明確にするために、ベクトルの宣言、

vector<int> v;

ある意味で、変数の宣言に似ています。

int x;

そして、あなたが望むなら、例えば、

cout << x;

ゴミが出ます。しかし、あなたが宣言した場合

int x(2);

何もかも良くなるだろう。同様にベクトルの場合:の宣言

vector<int> v;

ベクトルにいくらかのメモリスペースを割り当てますが、それを埋めません。次に、指定できます

vector<int> v(2);

これは、2つの要素のベクトルを宣言したか、ベクトルのみの機能であるpush_backを使用したことを意味します。お気づきのように、これによりベクトルに要素が追加されます。

于 2013-03-06T16:35:19.543 に答える
3

std::vector<int>ではないからstd::map<int, int>です。

std::vectorコレクションに含めるには、要素を手動でpush_back()、または (C++11 の場合)する必要があります。emplace_back()もちろん、一部のコンストラクターでは、初期要素を含めることができます。そしてもちろん、その代入演算子です。

subscript( ) 演算子は、既存の要素の[]読み取りおよび/または変更にのみ使用する必要があります。範囲外 (存在しない) 要素を使用してインデックスを作成すると、未定義の動作が発生します。operator[]

于 2013-03-06T03:54:58.310 に答える
0

最初に、次のような要素の値を設定するためのメモリを割り当てる必要があります。

v.resize(new_size);

またはpush_backメソッドを使用して要素を追加します。

于 2013-03-06T04:13:40.980 に答える
0

v[0]まだ存在しないため、アクセスできませv[0]ん。ベクトルは、空のベクトルとしてデフォルトで構築されます。要素を背面にプッシュすると、サイズが 1 ずつ大きくなります。これで、追加したばかりの要素にアクセスできるようになります。1 つの要素で開始する場合は、適切なコンストラクターを使用します。

std::vector<int> v(1); //one zeroed integer

あなたはリンゴとオレンジを比較しています。int i = 0;のようになりますstd::vector<int> v;

于 2013-03-06T03:55:05.300 に答える