我可以调用采取使用一个std ::向量而不是数组/指针参数的函数?(Can I call funct

2019-06-27 05:42发布

我想重写使用了大量的一些代码, 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());

确实通过在同一载体动作的第一个元素的地址是作为通过在所述第一元件的所述地址在原始阵列。 难道这简单吗?

Answer 1:

是的,一个向量的元素放心是连续的类似的阵列。

参考:

C ++ 03标准:[lib.vector] 23.2.4类模板矢量

......
一个向量的元素被存储连续的,这意味着如果vvector<T, Allocator>其中T是某种类型比其它bool ,那么它遵循身份&v[n] == &v[0] + n为所有0 <= n < v.size()



Answer 2:

C ++ 98并没有要求连续分配在数据std::vector ,但是这就是所有已知的实现做了反正。

由于C ++ 03,这是标准化的要求,因此它现在需要的,事情不只是如何碰巧。



Answer 3:

是的,你可以做到这一点,只要缓冲区永远不会空。

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



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