使用c风格API迭代std::vector中的所有元素
Iterate all elements in std::vector using c-style API
根据"第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)而不会出现编译问题),那么您将处于良好状态。
相关文章:
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 对 Vector 元素 (C++) 的push_back操作
- 从 std::vector 中选择一个元素,而不是给定元素
- 将 Vector<String > 元素复制到其他 Vector<String>* (1 作为
- 有没有更快的方法可以在 std::vector 中插入元素
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 通过引用传递时访问std::vector的元素
- 有没有函数可以直接获取 std::vector 元素的大小?
- 如何非常快速地将数字添加到 Vector 中的一系列元素中
- 如何安全地擦除 std::vector 中的元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>