パラメータとしてポインタのポインタをとるCライブラリAPI関数があるとします。しかし、私はC++でプログラミングしているので、動的メモリを扱うためにstd vectorを利用したいと思います。どのようにベクトルのベクトルをポインタのポインタに効率的に変換できますか?今私はこれを使用しています。ベクトルのベクトルをポインタのポインタに変換する
#include <vector>
/* C like api */
void foo(short **psPtr, const int x, const int y);
int main()
{
const int x = 2, y = 3;
std::vector<std::vector<short>> vvsVec(x, std::vector<short>(y, 0));
short **psPtr = new short*[x];
/* point psPtr to the vector */
int c = 0;
for (auto &vsVec : vvsVec)
psPtr[c++] = &vsVec[0];
/* api call */
foo(psPtr, x, y);
delete[] psPtr;
return 0;
}
これは目標を達成するための最良の方法ですか?この場合、イテレータまたはいくつかのstdメソッドを使って "新しい削除"を取り除くことはできますか?前もって感謝します。
編集: 私は現在、このバージョンを使用してCコードとインターフェイスしています。私はここにそれを掲示しています。
#include <vector>
/* C like api */
void foo(short **psPtr, const int x, const int y);
int main()
{
const int x = 2, y = 3;
std::vector<std::vector<short>> vvsVec(x, std::vector<short>(y, 0));
std::vector<short*> vpsPtr(x, nullptr);
/* point vpsPtr to the vector */
int c = 0;
for (auto &vsVec : vvsVec)
vpsPtr[c++] = vsVec.data();
/* api call */
foo(vpsPtr.data(), x, y);
return 0;
}
もっと見るC++ like私に。全てに感謝!
ドロップベクターの1つのレベルとその平坦ベクトルの最初の要素へのポインタのアドレスを取ります。 – rubenvb
psPtrをベクトルに置き換えて、アルゴリズムの一部の機能で設定することができます。 –
BlueWanderer
API関数は、sizeパラメータを必要とするか、またはヌルポインタが最後の要素を表すという規約を持っています。その場合、最後に 'nullptr'を追加する必要があります。 –