Предположим, у меня есть функция API библиотеки C, которая принимает указатель указателей в качестве параметра. Однако, поскольку я программирую на C++, я бы хотел использовать std-вектор для работы с динамической памятью. Как я могу эффективно преобразовать вектор вектора в указатель указателя? Сейчас я использую это.Преобразование вектора вектора в указатель указателя
#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++, как мне. Спасибо за все!
Капля один уровень вектора и взять адрес указателя на первый элемент этого плоского вектора. – rubenvb
Только сделать это лучше, вы можете заменить psPtr на вектор и настроить его с помощью некоторой функции в алгоритме. –
BlueWanderer
Функция API либо нуждается в параметре размера, либо имеет соглашение о том, что нулевой указатель обозначает последний элемент, и в этом случае вы должны добавить 'nullptr' в конце. –