我可以用std::vector调用接受数组/指针参数的函数吗
Can I call functions that take an array/pointer argument using a std::vector instead?
我想重写一些使用大量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类模板向量
向量的元素是连续存储的,这意味着如果v
是vector<T, Allocator>
,其中T
是除bool
之外的某种类型,则它服从所有0 <= n < v.size()
的恒等式&v[n] == &v[0] + n
C++98没有强制为std::vector
中的数据进行连续分配,但所有已知的实现都是这样做的。
从C++03开始,这是一个标准化的需求,所以现在它是必需的,而不仅仅是事情发生的方式。
是的,您可以这样做,只要缓冲区从不为空。
如果向量为空,则&buffer[0]
是一个错误,并且它可能会崩溃,即使被调用的函数通常不会因为大小为0而取消引用指针。
相关文章:
- 为函数定义符号不明确的指针参数
- 构造函数 (C++) 中的 char 指针参数存在问题
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么具有指针参数的成员函数需要指向指针的指针?
- 通过引用函数传递指针参数是什么意思?
- 从double到double*的指针参数
- void 函数中的指针参数返回不一致的值
- 无法向上转换指针到指针参数
- 将数组动态分配到具有指针参数的函数中
- 模板函数指针参数与构造函数参数
- 使用通用函数指针参数化函数模板的简洁方法
- 如何为C++字符串分配空指针参数?
- C++带有指针参数的函数
- 指针参数的默认值
- 将常量添加到函数模板指针参数
- 如何传递unique_ptr<T>代替原始*输出*指针参数?
- 不带星号的函数指针参数
- 功能指针参数参数转换为const
- 将指针参数传递给双指针参数
- 如何调试指针参数是否通过函数修改