1

C++ 入門書の第 (3) 章には、ベクトル内の要素をゼロにリセットする次の for ループがあります。

vector<int> ivec; //UPDATE: vector declaration
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix)
ivec[ix] = 0;

for ループは本当に0要素に値を割り当てているのでしょうか、push_backそれとも関数を使用する必要があるのでしょうか?

では、以下は有効ですか?

ivec[ix] = ix;

ありがとう。

4

5 に答える 5

5

forループは実際に要素に0の値を割り当てていますか?または、push_backフィンクションを使用する必要がありますか?

ivec[ix] =0push_back関数がベクトルに新しい要素を追加している間、ベクトル内の既存の要素の値を更新します!

それで、次は有効ですか?
ivec [ix] = ix;

それは完全に有効なIF ix < ivec.size()です。

iteratorインデックスの代わりに、を使用するとさらに良いでしょう。このような、

int ix = 0;
for(vector<int>::iterator it = ivec.begin() ; it != ivec.end(); ++it)
{ 
     *it = ix++; //or do whatever you want to do with "it" here!
}

STLでの使用iteratorは慣用的です。インデックスよりもイテレータを優先してください!

于 2011-01-31T11:00:35.987 に答える
2

はい、角かっこを使用して、ベクトルの既存の要素を取得および上書きできます。ただし、角かっこを使用して新しい要素をベクトルに挿入することはできません。実際、ベクトルの終わりを超えてインデックスを作成すると、未定義の動作が発生し、プログラムが完全にクラッシュすることがよくあります。

ベクトルを拡大するには、push_back、挿入、サイズ変更、または関数の割り当てを使用できます。

于 2011-01-31T11:01:15.927 に答える
0

このforループの目的は、ベクトルの要素を反復処理することです。要素x(ixが0の場合)から最後の要素(ixがivec.size()-1の場合)まで。

各反復で、ベクトルの現在の要素は9に設定されます。これがステートメントの内容です。

ivec[ix] = 0;

します。パッティング

ivec[ix] = ix;

forループでは、ベクトルのすべての要素がベクトル内の位置に設定されます。つまり、最初の要素の値はゼロになり(ベクトルは0からインデックス付けを開始するため)、2番目の要素の値は1になり、以下同様に続きます。

于 2011-01-31T11:04:53.490 に答える
0

配列ブラケットを使用すると、ベクトルオブジェクトは他の単純な配列と同じように機能します。 push_back()その長さを1要素増やし、新しい/最後の要素を渡された値に設定します。

于 2011-01-31T11:04:34.490 に答える
0

はい、ix が有効なインデックスであると仮定すると、ほとんどの場合、int のベクトルがあり、インデックスは size_type です。もちろん、無効なインデックスを表示するために意図的に -1 を格納したい場合があるため、unsigned から signed への変換が適切ですが、その場合は static_cast を使用することをお勧めします。

あなたがしていることをすること(ベクトルの各値をそのインデックスに設定すること)は、他のコレクションのインデックスを作成する方法です。次に、他のコレクションの予測に基づいてベクトルの並べ替えを再配置します。

オーバーフローしないと仮定すると (システムが 32 ビット以上の場合はほとんどありません)、変換は機能するはずです。

于 2011-01-31T11:34:00.850 に答える