将向量的矢量转换为指针的指针

2022-08-23 00:00:00 pointers c++ c++11 stdvector
假设我有一个以指针指针为参数的C库API函数。然而,由于我是用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;
}

这是实现目标的最好方法吗?在这种情况下,我是否可以通过使用迭代器或某种标准方法来删除"新删除"的内容?提前谢谢。

编辑: 根据回答,我现在正在使用这个版本来与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++。谢谢大家!


解决方案

这是实现目标的最佳方法吗?

如果您确定向量的向量将超过psPtr,则是。否则,您将面临psPtr包含无效指针的风险。

在这种情况下,我可以通过使用迭代器或某个标准方法来删除"new delete"吗?

是的。我建议使用:

std::vector<short*> psPtr(vvsVec.size());

,然后在调用C API函数时使用&psPtr[0]。这从代码中消除了内存管理的负担。

foo(&psPtr[0]);        

相关文章