ベクトルを効率的に使用しようとしています。したがって、最初にメモリを予約してから、ベクトルを使用します。しかし、[]演算子を使用してベクトルを埋めようとすると、ベクトルのサイズはゼロのままになります。なぜこれが起こるのですか?
vector Vec;
Vec.reserve(10);
Vec[0] = 2.0;
Vec[1] = 3.0;
...
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);
reserve()
ベクトルのサイズは変更されません。を使用する必要がありますresize()
。
使用するreserve
場合、実際にはベクター内に要素を作成していません。割り当ては、存在しない要素にアクセスしています。
std::vectorは自動的に展開されません。関数reserve(size)はサイズを大きくしません。後でサイズを拡張するために、十分なメモリがあることを確認するだけです。
だから違法の代わりに
Vec[0] = 2.0;
試す
Vec.push_back( 2.0 );
これにより、ベクトルサイズが1増加します。
ちなみに、宣言は
vector<double> Vec;
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 ... };
これらの方法は両方とも、ベクトル内のデータを直接初期化するという利点があります。