私はOpenGL/C ++プログラムに取り組んでおり、ウィンドウに座標をプロットするときに座標を保存する必要があります。しかし、プロットされるポイントの数が定義されていないため、配列のサイズを修正することはできません。アレイに動的にスペースを割り当てることは可能ですか?他のデータ構造を使用して同じことを実現できますか?
2 に答える
はい、std::vector
代わりに使用してください。
あなたと組み合わせるとpush_back
、要素の数を動的に増やすことができます。
std::vector<Coordinate> coordinates;
coordinates.push_back(Coordinate(0,0));
coordinates.push_back(Coordinate(1,1));
配列の場合と同じように要素にアクセスできます。
coordinates[0], coordinates[1]...
提案されているように、anstd::vector
は適切な選択であり、このコンテナは連続したメモリを保証します。これは、座標バッファとして渡すのに役立ちます。
std::vector<Coordinate> coordinates;
coordinates.push_back(Coordinate(0,0));
coordinates.push_back(Coordinate(1,1));
// ... add more coordinates...
RenderBuffer(coordinates.data());
もちろん、メモリがバッファ形式に適している限り。
ただし、連続したメモリを使用するため、メモリブロックの再割り当てにより、挿入方法にコストがかかる可能性があります。これが問題になる可能性がある場合、メモリの最大/最小要件がわかっている場合は、サイズを1回予約することでそれを取り除くことができます。
// Create 100 instances of Coordinate and fill all instances with Coordinate(0, 0)
std::vector<Coordinate> coordinates(100, Coordinate(0, 0));
coordinates[0] = Coordinate(0,0);
coordinates[1] = Coordinate(1,1);
// ... add more coordinates...
RenderBuffer(coordinates.data());
ただし、これを行う場合、配列を使用することに違いはありません。
// Create 100 instances of Coordinate and fill all instances with Coordinate(0, 0)
Coordinate[100];
coordinates[0] = Coordinate(0,0);
coordinates[1] = Coordinate(1,1);
// ... add more coordinates...
RenderBuffer(coordinates);
1つの例外を除いて、配列は必要に応じてサイズを変更できませんが、std::vector
サイズを変更することはできます。
// Create 100 instances of Coordinate and fill all instances with Coordinate(0, 0)
std::vector<Coordinate> coordinates(100, Coordinate(0, 0));
coordinates[0] = Coordinate(0,0);
coordinates[1] = Coordinate(1,1);
// ... add lots of lots of lots of coordinates...
// Damn! We need more Coordinates, let's add more without worrying about resizing:
coordinates.push_back(Coordinate(0,0));
coordinates.push_back(Coordinate(1,1));
RenderBuffer(coordinates.data());
連続したメモリが必要ない場合は、std::list
のような他のコンテナの使用を検討する必要があります。挿入方法は同じstd::list<>::push_back
ですが、この種のコンテナの挿入はまったく高価ではありません(少なくともベクトルほど高価ではありません)。
一部の呼び出しstd::vector<>::resize
のサイズを変更する代わりに、一度サイズ変更する方法を使用することもできます。std::vector<>::push_back