C++ vector.begin() and vector[0]

C++ vector.begin() and vector[0]

本文关键字:vector and begin C++      更新时间:2023-10-16

为什么这两行打印不同的地址?

vector<int> v1{ 12,2,34 };
printf_s("%d -  0x%pn", v1[0], &v1[0]);
printf_s("%d -  0x%pn",*v1.begin(), v1.begin());

此地址中的值相同,但地址本身不同。这是否意味着同一数组有两个副本?

编辑:在调试模式下,它打印不同的地址,在发布模式下,有相同的地址:)

v1.begin()返回一个std::vector<int>::iterator,这不一定是v1[0]的地址。事实上,尝试使用 printf 打印出来会给我一个警告:

警告:格式">%p"需要类型为">void*"的参数,但参数 3 的类型为"std::vector::iterator">

除非您确定在您的特定标准库实现和当前编译选项中std::vector<int>::iteratorint* 的别名,否则比较是没有意义的。

对于矢量对象 v1:

&V[0] 是对象 v1 的第一个元素的地址。

例如,当我们创建一个迭代器时vector<>::iterator iter iter本身是另一个对象,如本文档中所述。

迭代器:一个类似指针的对象,可以用++递增, 用 * 取消引用,并使用 != 与另一个迭代器进行比较。

我希望这本参考手册能详细回答您的问题。