如何获取原始数据的std :: vector指针?

我正在尝试使用 std::vector 作为 char 数组 .

我的函数接受一个void指针:

void process_data(const void *data);

在我刚刚使用此代码之前:

char something[] = "my data here";
process_data(something);

哪个按预期工作 .

但是现在我需要 std::vector 的动态性,所以我尝试了这个代码:

vector<char> something;
*cut*
process_data(something);

问题是,如何将char矢量传递给我的函数,以便我可以访问矢量原始数据(无论它是哪种格式 - 浮点数等)?

我试过这个:

process_data(&something);

还有这个:

process_data(&something.begin());

但它返回了指向乱码数据的指针,后者发出了警告: warning C4238: nonstandard extension used : class rvalue used as lvalue .

回答(3)

3 years ago

&something 为您提供 std::vector 对象的地址,而不是它所拥有的数据的地址 . &something.begin() 为您提供 begin() 返回的迭代器的地址(正如编译器警告的那样,这在技术上是不允许的,因为 something.begin() 是一个右值表达式,因此无法获取其地址) .

假设容器中至少有一个元素,您需要获取容器的初始元素的地址,您可以通过该地址获取

  • &something[0]&something.front() (索引0处元素的地址),或

  • &*something.begin() (由 begin() 返回的迭代器指向的元素的地址) .

在C 11中,一个新的成员函数被添加到 std::vectordata() . 此成员函数返回容器中初始元素的地址,就像 &something.front() 一样 . 这个成员函数的优点是即使容器为空也可以调用它 .

3 years ago

something.data() 将返回指向向量数据空间的指针 .

3 years ago

改为使用指向第一个元素的指针:

process_data (&something [0]);