使用c风格API迭代std::vector中的所有元素

Iterate all elements in std::vector using c-style API

本文关键字:元素 vector 使用 风格 API 迭代 std      更新时间:2023-10-16

根据"第16项"。知道如何将向量和字符串数据传递给遗留api。Scott Meyers的Effective STL:

使用c风格的API访问vector的所有元素是安全的,因为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风格API一起使用,c++标准中是否对元素类型T有要求?

如果T是内置类型或POD类型是否总是安全的?

不,不要求元素类型为T。vector将分配内存,使vector中的每个元素消耗sizeof(T)字节。当您编写一个循环,通过指针算术(或索引,这是指针算术的底层)在底层数组上迭代时,在自增/自减期间使用完全相同的元素大小(sizeof(T))。

然而,假设你将在真C中读写底层数据数组,那么你将面临这样的限制:c++类类型(如std::string, MyCustomClass等)不能作为T使用,因为你的C函数不可能安全地接受这些类型。只要T是c++和C语言都知道存储大小的类型(即两者都可以使用sizeof(T)而不会出现编译问题),那么您将处于良好状态。

相关文章: