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

时间:2017-02-22 19:11:50

标签: c++ c++11 pointers 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;
}

这是实现目标的最佳方式吗?在这种情况下,我可以通过使用迭代器或某些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 ++。谢谢大家!

2 个答案:

答案 0 :(得分:4)

  

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

如果您确定向量矢量将比psPtr更长,那么是。否则,您将面临psPtr将包含无效指针的风险。

  

我可以摆脱&#34;新删除&#34;在这种情况下使用迭代器或某些std方法的东西?

是。我建议使用:

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

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

foo(&psPtr[0]);        

答案 1 :(得分:3)

std::vector<short*> vecOfPtrs;
for (auto&& vec : vvsVec)
    vecOfPtrs.push_back(&vec[0]);

foo(&vecOfPtrs[0]);