Załóżmy, że mam funkcję API biblioteki C, która przyjmuje wskaźnik wskaźników jako parametr. Ponieważ jednak programuję w C++, chciałbym skorzystać z wektora std, aby poradzić sobie z pamięcią dynamiczną. Jak mogę skutecznie przekonwertować wektor wektora na wskaźnik wskaźnika? Teraz używam tego.Konwertuj wektor wektora na wskaźnik wskaźnika
#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;
}
Czy to najlepszy sposób na osiągnięcie celu? Czy mogę pozbyć się "nowego usunięcia", używając w tym przypadku iteratora lub jakiejś metody std? Z góry dziękuję.
Edytuj: Zgodnie z odpowiedziami używam teraz tej wersji do interfejsu z kodem C. Zamieszczam to tutaj.
#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;
}
Wygląda bardziej na C++ jak dla mnie. Dzięki za wszystko!
upuść jeden poziom wektora i wziąć adres wskaźnik do pierwszego elementu tej płaskiej wektorze. – rubenvb
Tylko dzięki temu, że wygląda ładniej, możesz zastąpić psPtr wektorem i ustawić go przy pomocy pewnej funkcji w algorytmie. –
BlueWanderer
Funkcja API albo potrzebuje parametru o rozmiarze, albo ma konwencję, że zerowy wskaźnik oznacza ostatni element, w którym to przypadku musisz dodać 'nullptr' na końcu. –