Giả sử tôi có hàm API thư viện C, con trỏ của con trỏ là tham số. Tuy nhiên kể từ khi tôi lập trình trong C + + tôi muốn tận dụng lợi thế của vector std để đối phó với bộ nhớ động. Làm thế nào tôi có thể chuyển đổi hiệu quả vector vectơ thành con trỏ của con trỏ? Ngay bây giờ tôi đang sử dụng này.Chuyển đổi vectơ của vectơ thành con trỏ của con trỏ
#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;
}
Đây có phải là cách tốt nhất để đạt được mục tiêu không? Tôi có thể loại bỏ điều "xóa mới" bằng cách sử dụng trình lặp hoặc phương thức std nào đó trong trường hợp này không? Cảm ơn trước.
Chỉnh sửa: Theo câu trả lời Tôi hiện đang sử dụng phiên bản này để giao tiếp với mã C. Tôi đăng nó ở đây.
#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ó vẻ như C++ giống với tôi hơn. Cảm ơn vì tất cả!
Thả một mức độ vector và lấy địa chỉ của một con trỏ đến phần tử đầu tiên của rằng vector phẳng. – rubenvb
Chỉ làm cho nó trông đẹp hơn, bạn có thể thay thế psPtr bằng một vector và thiết lập nó bằng một số hàm trong thuật toán. –
BlueWanderer
Hàm API cần tham số kích thước hoặc có quy ước rằng một con trỏ rỗng biểu thị phần tử cuối cùng, trong trường hợp này bạn phải thêm một 'nullptr' vào cuối. –