我可以用std::vector调用接受数组/指针参数的函数吗

Can I call functions that take an array/pointer argument using a std::vector instead?

本文关键字:指针 参数 函数 数组 std vector 调用 我可以      更新时间:2023-10-16

我想重写一些使用大量unsigned char数组的代码,转而使用std::vector<unsigned char>对象。我遇到的问题是,这些当前用于存储将被写入串行端口或套接字写入缓冲区的数据,而执行此操作的库函数需要void*unsigned char*。就是这种功能的一个例子

  WriteToSocketBuffer(unsigned char* pBuffer, int iSize);

所以目前我有形式的代码

 unsigned char* pArray = new unsigned char[iSize];
 //   populate array with data
 WriteToSocketBuffer(pArray,iSize);
 delete [] pArray;

我的问题如下:如果我将类更改为std::vector<unsigned char>而不是原始数组,我可以简单地使用调用库函数吗

  std::vector<unsigned char> myVector;
  WriteToSocketBuffer(&myVector[0],myVector.size());

传递向量中第一个元素的地址是否与传递原始数组中第一个元件的地址相同。就这么简单吗?

是,向量的元素被保证是连续的,类似于数组。

参考:

C++03标准:[lib.vvector]23.2.4类模板向量


向量的元素是连续存储的,这意味着如果vvector<T, Allocator>,其中T是除bool之外的某种类型,则它服从所有0 <= n < v.size() 的恒等式&v[n] == &v[0] + n

C++98没有强制为std::vector中的数据进行连续分配,但所有已知的实现都是这样做的。

从C++03开始,这是一个标准化的需求,所以现在它是必需的,而不仅仅是事情发生的方式。

是的,您可以这样做,只要缓冲区从不为空。

如果向量为空,则&buffer[0]是一个错误,并且它可能会崩溃,即使被调用的函数通常不会因为大小为0而取消引用指针。