gpt4 book ai didi

c++ - 将 std::vector::data 传递给期望类型**(双指针)的函数

转载 作者:行者123 更新时间:2023-11-30 03:12:55 31 4
gpt4 key购买 nike

如标题所述,我试图将指向 std::vector 数据的指针传递给需要双指针的函数。以下面的代码为例。我有一个 int 指针 d 作为 &d 传递给 myfunc1 (仍然不确定是否称它为指针的引用或什么),其中函数更改其对填充有 1,2,3,4 的 int 数组开头的引用。但是,如果我有一个 std::vector 的整数并尝试将 &(vec.data()) 传递给 myfunc1 编译器会抛出错误 lvalue required as unary '&' operand。我已经根据 this answer 尝试过类似 (int *)&(vec.data()) 的方法, 但它不起作用。

仅供引用,我知道我可以做类似 myfunc2 的事情,我直接传递 vector 作为引用,然后工作就完成了。但我想知道是否可以将 myfunc1 与 std::vector 的指针一起使用。

非常感谢任何帮助。

#include <iostream>
#include <vector>


using std::cout;
using std::endl;
using std::vector;

void myfunc1(int** ptr)
{
int* values = new int[4];
// Fill all the with data
for(auto& i:{0,1,2,3})
{
values[i] = i+1;
}

*ptr = values;
}

void myfunc2(vector<int> &vec)
{
int* values = new int[4];
// Fill all the with data
for(auto& i:{0,1,2,3})
{
values[i] = i+1;
}

vec.assign(values,values+4);
delete values;
}

int main()
{
// Create int pointer
int* d;

// This works. Reference of d pointing to the array
myfunc1(&d);

// Print values
for(auto& i:{0,1,2,3})
{
cout << d[i] << " ";
}
cout << endl;

// Creates the vector
vector<int> vec;

// This works. Data pointer of std::vector pointing to the array
myfunc2(vec);

// Print values
for (const auto &element : vec) cout << element << " ";
cout << endl;

// This does not work
vector<int> vec2;
vec2.resize(4);

myfunc1(&(vec2.data()));

// Print values
for (const auto &element : vec2) cout << element << " ";
cout << endl;

return 0;
}

编辑:我的实际代码所做的是从磁盘读取一些二进制文件,并将部分缓冲区加载到 vector 中。我在从读取函数中获取修改后的 vector 时遇到了麻烦,这就是我想出的解决办法。

最佳答案

当你写的时候:myfunc1(&(vec2.data()));

您正在获取右值的地址。指向的 int* 是临时的,会在调用后立即销毁。

这就是您收到此错误的原因。

但是,正如 @molbdnilo 所说,在您的 myfunc1() 函数中,您正在重新分配指针(不关心销毁之前分配的顺便说一下内存)。
但是 std::vector 已经自行管理其数据内存。你不能也不能 Handlebars 放在上面。


What my actual code does is to read some binary files from disk, and load parts of the buffer into the vector.

一个解决方案可能是通过将迭代器传递到开头并将迭代器传递到所需部分的末尾来构造您的 std::vector 以提取构造函数的参数。

例如:

int * buffer = readAll("path/to/my/file"); // Let's assume the readAll() function exists for this example

// If you want to extract from element 5 to element 9 of the buffer
std::vector<int> vec(buffer+5, buffer+9);

如果 std::vector 已经存在,您可以像在 myfunc2() 中那样使用 assign() 成员函数:

vec.assign(buffer+5, buffer+9);

当然,在这两种情况下,您都必须确保在访问缓冲区时没有尝试访问越界元素。

关于c++ - 将 std::vector::data 传递给期望类型**(双指针)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59135673/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com