gpt4 book ai didi

c++ - &vector[0] 和 vector.begin() 有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:08 28 4
gpt4 key购买 nike

这个问题与 effective STL book 的第 16 条有关,其中指出在遗留代码中使用 vector (假设 vector<int>vec )而不是数组时,我们必须使用 &vec[0] 而不是 vec.begin() :

 void doSomething(const int* pInts, size_t numlnts);  
dosomething(&vec[0],vec.size()); \\correct!!
dosomething(vec.begin(),vec.size()); \\ wrong!! why???

书上说vec.begin()&vec[0] 不同.为什么 ?两者有什么区别?

最佳答案

A std::vector是封装动态大小数组的序列容器。这使您可以方便地存储一堆元素,而无需关心管理作为元素存储的底层数组。使用这些类的很大一部分便利在于它们为您提供了一堆方法,让您无需处理原始指针即可处理序列,迭代器就是一个例子。

&vec[0] 是指向 vector 正在使用的底层存储的第一个元素的指针。 vec.begin() 是一个 iterator从 vector 的开头开始。虽然这两者都为您提供了一种访问序列中元素的方法,但这是两个不同的概念。搜索迭代器以更好地了解其工作原理。

如果你的代码支持iterators使用迭代器迭代数据通常最简单。部分原因是迭代器不是指针,它们让您可以迭代数据结构的元素,而无需了解您正在迭代的数据结构的实现细节。

但是有时您需要项目的原始数组,例如在某些遗留 API 或对 C 代码的调用中,您可能需要将指针传递给数组。在这种情况下,您别无选择,只能从 vector 中提取原始数组,您可以使用诸如 &vec[0] 之类的东西来做到这一点。请注意,如果您有 c++11 支持,则有一种明确的方法可以使用 std::vector::data 执行此操作这将使您能够访问底层存储阵列。 c++11 方式还有一个额外的好处,就是可以更清楚地向阅读您的代码的人说明您的意图。

关于c++ - &vector[0] 和 vector.begin() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55932091/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com