我需要使用库提供的一些低级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()'方法?
答案 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。在我看来,使用它可以使代码变得更加重要,而且其他人虽然也是如此,或者它不会被添加。