我尝试将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
。
答案 0 :(得分:218)
&something
为您提供std::vector
对象的地址,而不是它所拥有的数据的地址。 &something.begin()
为您提供begin()
返回的迭代器的地址(正如编译器警告的那样,这在技术上是不允许的,因为something.begin()
是一个右值表达式,因此无法获取其地址)。 / p>
假设容器中至少有一个元素,您需要获取容器的初始元素的地址,您可以通过
获取该元素的地址。 &something[0]
或&something.front()
(索引0处元素的地址)或
&*something.begin()
(由begin()
返回的迭代器指向的元素的地址。)
在C ++ 11中,std::vector
添加了一个新的成员函数:data()
。此成员函数返回容器中初始元素的地址,就像&something.front()
一样。这个成员函数的优点是即使容器为空也可以调用它。
答案 1 :(得分:72)
something.data()
将返回指向向量数据空间的指针。
答案 2 :(得分:12)
改为使用指向第一个元素的指针:
process_data (&something [0]);