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

Roo*_*kie 150 c++ stl vector

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

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

void process_data(const void *data);
Run Code Online (Sandbox Code Playgroud)

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

char something[] = "my data here";
process_data(something);
Run Code Online (Sandbox Code Playgroud)

哪个按预期工作.

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

vector<char> something;
*cut*
process_data(something);
Run Code Online (Sandbox Code Playgroud)

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

我试过这个:

process_data(&something);
Run Code Online (Sandbox Code Playgroud)

还有这个:

process_data(&something.begin());
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 227

&something为您提供std::vector对象的地址,而不是它所拥有的数据的地址. &something.begin()给你返回的迭代器的地址begin()(因为编译器警告,这在技术上是不允许的,因为它something.begin()是一个rvalue表达式,所以不能采用它的地址).

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

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

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

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

  • **重要**小心`vector <bool>`这是这个答案的例外(并且没有`bool`s的连续内存存储). (97认同)
  • 从好的方面来说,没有什么需要注意的:所有这三种方法都无法使用`std :: vector <bool>`进行编译,因为`std :: vector <bool>`需要使用代理对象,代理不能隐式转换为`bool*`.作为解决方法,如果你确实需要一个`bool`序列,最好只使用`std :: vector <char>`.@Motti (18认同)
  • 为了全面,但主要是为`.data()` - 我会假装我没有看到丑陋的`&*iterator`:P (7认同)
  • 指针从`data()`返回多长时间?如果向量从未调整大小或更大(通过`push_back()`或其他函数,包括`reserve`),是否保证只要向量存在,指针就会生存,指向正确的位置? (2认同)

Chr*_*odd 74

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

  • @ChrisDodd:`vector :: data()`是C++ 11的新手 (33认同)
  • @Rookie:看起来你正在使用一个破碎的编译器--C++规范中的23.3.6.3定义了vector :: data.尝试向您的供应商提交错误或获得更好的编译器. (2认同)
  • @Chris Dodd 我也有同样的错误。我正在使用 Visual Studio 2008。 (2认同)

Ste*_*Don 12

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

process_data (&something [0]);
Run Code Online (Sandbox Code Playgroud)