【问题标题】:Conversion from array to vector - Interface with C library从数组到向量的转换 - 与 C 库的接口
【发布时间】:2016-06-06 22:29:48
【问题描述】:

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

仅供参考,我在 Red Hat Linux 下工作,使用 GCC 4.4.7(所以不是真正符合 C++11,https://gcc.gnu.org/gcc-4.4/cxx0x_status.html)。

这是我正在尝试做的一个 sn-p:

#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 中那样返回“整个”向量是否是个好主意。

对于向量,是否有比在循环中使用方法“pushback()”填充“myData”的最佳方法?

【问题讨论】:

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


    【解决方案1】:

    你可以这样做,很安全:

    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]);
    }
    

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

    编辑

    不使用向量,因为您确切地知道大小,您可以使用std::array&lt;std::uint8_t, DATA_BLOCKS&gt; 容器(C++11 中的新功能)。这个用法和我的例子中的向量一样

    EDIT2

    向量和数组使用连续的存储位置(reference for vector class),因此如果您从第一个元素获取地址,则可以通过递增地址来访问第二个元素。 vector 唯一的危险点是确保已分配内存。在这两种情况下,我都设法分配了足够的内存:在第一个示例中,向量与填充构造函数一起实例化,在第二个示例中,我将向量调整为相应的大小。这种方法在“Effective STL - 50 Specific Ways to Improvement Your Use of the Standard Template Library”[Scott Meyers] 一书中有所描述。对于数组,没问题(当然前提是声明数组有足够的内存)。

    【讨论】:

    • 所以,我想使用 std::array 但我的 GCC 版本没有。我为 g++ 提供了标志 '-std=c++0x' 只是为了确保使用最接近 C++11 兼容的东西(即使它离它很远)。
    • 另一方面,如果可以的话,我想对您的第一种方法进行一些解释,因为即使您将其称为“安全”,也不确定如何理解第一个案例的引用-数组部分 O_o
    • 只是一个愚蠢的复制/粘贴错误,但在你的第二个例子中,不应该有'return')
    • @Paradox 2nd example 更正了,我在 EDIT2 中解释了对数组的第一个案例的引用。我希望它很清楚
    • 个人而言,为了保持命名与示例一致,我将命名向量缓冲区,然后写buffer.data()而不是&amp;buffer[0]
    【解决方案2】:

    data() 随 C++11 一起提供。在我看来,使用它可以使代码更容易理解,而且显然其他人也是如此,否则它就不会被添加。

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 2011-04-19
    • 2020-02-26
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多