Convert vector of vector to pointer of pointer(将向量的矢量转换为指针的指针)
本文介绍了将向量的矢量转换为指针的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有一个以指针指针为参数的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]);
这篇关于将向量的矢量转换为指针的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:将向量的矢量转换为指针的指针


基础教程推荐
猜你喜欢
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- CString 到 char* 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 初始化列表*参数*评估顺序 2021-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01