首页 > 解决方案 > 有没有什么巧妙的方法可以从数组向量中获取指向数据的指针?

问题描述

我有一个从第三方函数返回的 c 样式数组。

我需要用这个数组的多个副本初始化缓冲区,然后将此缓冲区作为指向数据的指针传递给另一个第三方函数。例如,如果一个段是,{1, 3, 5, 8}那么缓冲区应该是{1, 3, 5, 8, 1, 3, 5, 8, 1, 3, 5, 8}.

考虑以下:

...
std::array <T, sizeOfSegment> segment;
...
std::vector<std::array<T, sizeOfSegment>> dataBuffer(countOfSegments, segment);
T* pData = dataBuffer.data()->data();

这看起来像一个丑陋的黑客。是否有任何替代方法来获取指向数据的指针,或者通过多个数据块初始化向量?

段和数据缓冲区的大小在编译时是已知的。

对我来说似乎有问题的是 data()->data() 调用返回指向 array<...> 的第一个实例的指针,但我会将它作为指向整个缓冲区的指针传递。虽然我知道这是正确的,因为缓冲区是数组序列,但它只是感觉不正确......我错了吗?

PS。根据要求示例:

void ThirdParty::ProcessData(int* pData, size_t data_size);
...
const size_t sizeOfSegment = 4;
std::array<int, sizeOfSegment> segment = {1, 3, 5, 8};
const size_t countOfSegments = 3;
std::vector<std::array<int, sizeOfSegment>> dataBuffer(countOfSegments, segment);
int* pData = dataBuffer.data()->data();
ProcessData(pData, sizeOfSegment*countOfSegments);
...

标签: c++c++17

解决方案


是否有任何替代方法来获取指向数据的指针,或者通过多个数据块初始化向量?

对我来说似乎有问题的是data()->data()call 返回指向 的第一个实例的指针array<...>,但我会将它作为指向整个缓冲区的指针传递。虽然我知道这是正确的,因为缓冲区是数组序列,但它只是感觉不正确......我错了吗?

由于您似乎在使用平面缓冲区,因此获得缓冲区的明确方法是声明 a std::vector<T>. 你不能合法地std::array<T, N>T*. 这只会导致未定义的行为。

一旦你解决了这个问题,向量的推导就非常简单,并且很容易验证是否正确。

std::vector<T> dataBuffer;
while(countOfSegments--) {
    dataBuffer.insert(dataBuffer.end(), segment.begin(), segment.end());
}

推荐阅读