从数组转换为向量 - 与C库的接口

时间:2016-02-24 14:53:31

标签: arrays c++11 gcc vector c++03

我需要使用库提供的一些低级C函数来包装它们并提供“更高级别的层”;在这种情况下,我的问题是获取缓冲区中包含的数据,至少要学习如何正确执行,我想知道您认为在C ++ 03和C +中要做的事情11。

仅供参考,我在Red Hat Linux下使用GCC 4.4.7(因此不符合C ++ 11,https://gcc.gnu.org/gcc-4.4/cxx0x_status.html)。

以下是我要做的事情的片段:

#define DATA_BLOCKS 4096 // the numbers of 16-bit words within the buffer

std::vector<uint16_t> myClass::getData()
{
    uint16_t buffer[DATA_BLOCKS];
    getDataBuf(fd, dma, am, buffer[]); //C-function provided by the library

    // pushing buffer content into vector
    std::vector <uint16_t> myData;
    for(int i=0; i<DATA_BLOCKS; i++)
         myData.pushback(buffer[i]);
    return myData;
}

在我提供的链接中,我无法找到在C ++ 11中继续返回“整个”向量的好主意。

对于向量,是否有最好的方法来填充'myData'而不是在循环中使用'pushback()'方法?

2 个答案:

答案 0 :(得分:4)

你可以这样做,这是安全的:

std::vector<uint16_t> myClass::getData()
{
    std::vector <uint16_t> myData(DATA_BLOCKS);
    getDataBuf(fd, dma, am, myData.data()); //C-function provided by the library
    // Old interface, before c++11 : getDataBuf(fd, dma, am, &myData[0]);

    return myData;
}

或者如果你想填充给定的矢量:

void myClass::getData(std::vector<uint16_t> &myData)
{
    myData.resize(DATA_BLOCKS);
    getDataBuf(fd, dma, am, myData.data()); //C-function provided by the library
    // Old interface, before c++11 : getDataBuf(fd, dma, am, &myData[0]);
}

个人而言,我对返回向量(可能使用移动语义)或填充给定向量没有意见

修改

而不是使用vector,因为你已经准确地知道了大小,你可以使用std::array<std::uint8_t, DATA_BLOCKS>容器(C ++ 11中的新增功能)。这个用法与我的例子中的vector相同

<强> EDIT2

向量和数组使用连续的存储位置(reference for vector class),因此如果从第一个元素获取地址,则可以通过递增地址来访问第二个元素。向量的唯一危险点是确保已分配内存。在这两种情况下,我都设置了足够的已分配内存:在第一个示例中,vector与填充构造函数进行实例化,在第二个示例中,我将向量调整为相应的大小。这种方法在“有效STL - 改善您对标准模板库的使用的50种具体方法”一书中进行了描述[Scott Meyers]。对于数组,没问题(当然,在声明具有足够内存的数组的条件下)。

答案 1 :(得分:1)

data()附带了C ++ 11。在我看来,使用它可以使代码变得更加重要,而且其他人虽然也是如此,或者它不会被添加。