【发布时间】:2020-01-22 19:54:50
【问题描述】:
我正在从 this post 学习向量,它们从迭代器开始。他们定义 .begin 和 .end 如下:
begin() – 返回指向向量中第一个元素的迭代器
end() – 返回一个指向理论元素的迭代器 跟随向量中的最后一个元素
然后他们给出以下代码 sn-p,我添加了第三个 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;
}
我的困惑是i 的地址保持不变,但i 的值已经改变。 i* 不意味着 i 只是被取消引用了吗?因此,如果i 的地址没有改变,则必须改变它的值,以便它能够具有不同的值。我想我可能会将迭代器与指针混淆。我知道auto 基本上是类型推断,但仅此而已。
所以我的问题是,如果向量中每个元素的地址都相同,i 的值如何变化?
【问题讨论】:
-
i是一个迭代器,它“像”一个指针。它包含某种句柄(可以是指针,也可以是索引),可用于 (a) 在集合中移动和 (b) 定位集合的当前元素。如果您在第一个循环中查看g1[i]和&i,您还会有同样的问题吗?如果不是,为什么? -
想象一下,如果
i只是一个int*。它可能有助于了解正在发生的事情。请注意,与其他容器不同,T*是std::vector<T>的有效迭代器类型,因此比较非常准确。 -
"因此,如果
i的地址没有改变,则必须更改其值,以便它能够具有不同的值" - 那就是i++循环中的语句。它使迭代器前进以引用向量中的下一个元素