2

ベクトルを効率的に使用しようとしています。したがって、最初にメモリを予約してから、ベクトルを使用します。しかし、[]演算子を使用してベクトルを埋めようとすると、ベクトルのサイズはゼロのままになります。なぜこれが起こるのですか?

vector Vec; 
Vec.reserve(10); 
Vec[0] = 2.0; 
Vec[1] = 3.0;
...
4

5 に答える 5

11

reserve()バッキングストアのスペースのみを予約するため、後続のプッシュされた要素で再割り当てを行う必要はありません(予約されたスペースを超えるまで)。ただし、ベクトルの実際のサイズは変更されないため、Vec[0] =アクセスは実際にはベクトルの終わりから実行されます。

あなたが使うことができます

vector Vec;
Vec.resize(10);
Vec[0] = 2.0;
Vec[1] = 3.0;

必要に応じて、サイズは10になります。または、この時点でサイズを2だけにしたいが、複数の再割り当てを避けるためにスペースを予約したい場合は、次を使用できます。

vector Vec;
Vec.reserve(10);
Vec.push_back(2.0);
Vec.push_back(3.0);
于 2013-02-06T19:06:10.413 に答える
3

reserve()ベクトルのサイズは変更されません。を使用する必要がありますresize()

于 2013-02-06T19:06:00.960 に答える
2

使用するreserve場合、実際にはベクター内に要素を作成していません。割り当ては、存在しない要素にアクセスしています。

于 2013-02-06T19:06:19.003 に答える
2

std::vectorは自動的に展開されません。関数reserve(size)はサイズを大きくしません。後でサイズを拡張するために、十分なメモリがあることを確認するだけです。

だから違法の代わりに

Vec[0] = 2.0;

試す

Vec.push_back( 2.0 );

これにより、ベクトルサイズが1増加します。

ちなみに、宣言は

vector<double> Vec;
于 2013-02-06T19:12:11.257 に答える
1

reserveベクトルのサイズには影響しません。私が使用したほとんどの実装では、次のアクセスによってプログラムが終了していました。そうでない場合は、おそらく間違ったオプションでコンパイルしました。

サイズが10のベクトルを直接作成する必要があります。

std::vector<double> vec( 10 );

挿入する値が定数の場合、次のように実行できます。

static double initVec[] = { 2.0, 3.0 ... };
std::vector<double> vec( begin( initVec ), end( initVec ) );

、またはC ++ 11を使用している場合:

std::vector<double> vec{ 2.0, 3.0 ... };

これらの方法は両方とも、ベクトル内のデータを直接初期化するという利点があります。

于 2013-02-06T19:21:30.897 に答える