理解向量中的 .begin 和 .end

S.R*_*jit 1 c++ vector auto

我正在从这篇文章中学习向量,它们从迭代器开始。他们定义 .begin 和 .end 如下:

begin() – 返回指向向量中第一个元素的迭代器

end() – 返回指向向量中最后一个元素之后的理论元素的迭代器

然后他们给出了以下代码片段,我添加了第三个 for 循环来表达我的问题。

#include<iostream>
#include<vector>

int main() {
    std::vector <int> g1; //creating a vector
    for (int i = 1; i <= 3; i++){
        g1.push_back(i);
    }
    std::cout << "Output of beginning and end values: ";
    for (auto i = g1.begin(); i != g1.end(); i++) {
        std::cout << *i << " "; 
    }
    std::cout << "\nOutput of beginning and end addresses: ";
    for (auto i = g1.begin(); i != g1.end(); i++) {
        std::cout << &i << " ";
    }
     //"Output of beginning and end values: 1 2 3"
     //"Output of beginning and end addresses: 0105FB0C 0105FB0C 0105FB0C"
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的困惑是地址i保持不变,但值i发生了变化。不i*意味着i只是取消引用吗?因此,i如果地址未更改,则某些内容必须更改其值,以便它能够具有不同的值。我想我可能会混淆迭代器和指针。我知道这auto基本上是类型推断,但仅此而已。

所以我的问题是,i如果向量中每个元素的地址都相同,那么它的值如何变化?

120*_*arm 7

&i是局部变量的地址i。这不会改变。 *i取消对迭代器的引用,并返回该向量元素处的值。 &*i将返回一个指向向量中元素的指针。

所以你循环应该使用

std::cout << &*i << " ";
Run Code Online (Sandbox Code Playgroud)

查看地址更改。

  • @S.Ramjit 是的,“int”在您的系统上是 4 个字节。其他系统可能具有不同的大小。 (2认同)