使用c风格的API

时间:2016-07-01 22:25:32

标签: c++ stl

根据“项目16.知道如何将矢量和字符串数据传递给传统API。”Scott Meyers的有效STL:

使用c风格的API访问vector的所有元素是安全的, 因为向量保证与数组具有相同的底层内存布局。

//example 1, do sth to all elements in vector using c-style API
void doSomething(const int *pInts, size_t numlnts);

vector<int> v;   
if (!v.empty()) {
    doSomething(&v[0], v.size()); 
}

//example 2, init vector with c-style API
size_t fillArray(double *pArray, size_t arraySize); 

vector<double> vd(maxNumDoubles);    
vd.resize(fillArray(&vd[0], vd.size())); 

要将vector与c-style API一起使用,c ++标准中的元素类型T是否有任何要求?

如果T是内置类型或POD类型,它总是安全吗?

1 个答案:

答案 0 :(得分:0)

不,不需要元素类型T.向量将分配内存,以便向量中的每个元素都使用sizeof(T)字节。当你编写一个循环,通过指针算法(或索引,它是引擎盖下的指针算法)迭代底层数组时,在递增/递减期间使用完全相同的元素大小(sizeof(T))。

但是,假设您将在真正的C中读取/写入基础数据数组,那么您将面临限制,因为它不能将像std :: string,MyCustomClass等C ++类类型用作T,因为它你的C函数不可能安全地接受这些类型。只要T是C ++和C语言都知道存储大小的类型(即两者都可以使用sizeof(T)而没有编译问题),那么你将处于良好状态。