为什么输出中&it
的值没有发生变化?
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec;
for (int i = 0; i < 10; ++i) vec.push_back(i);
int count = 0;
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << "count = " << count++ << " &it = " << &it << endl;
if (*it % 2 == 0) {
vec.erase(it);
}
}
for (auto v : vec) {
cout << "v = " << v << endl;
}
return 0;
}
输出:
count = 0 &it = 0xfffff944f400
count = 1 &it = 0xfffff944f400
count = 2 &it = 0xfffff944f400
count = 3 &it = 0xfffff944f400
count = 4 &it = 0xfffff944f400
v = 1
v = 3
v = 5
v = 7
v = 9
在您的代码中,&it 是输出迭代器 it 的地址,而迭代器是一个对象,其地址在循环中没有发生变化是正常的。
在 for 循环中,每次迭代都会创建一个新的迭代器对象,并将其初始化为容器的 begin 位置。因此,&it 输出的是每个迭代器对象的地址,并不代表迭代器的值。
如果您想输出迭代器指向的值,可以使用 *it,而不是 &it。以下是修改后的代码示例:
cpp
Copy code
using namespace std;
int main() {
vector<int> vec;
for (int i = 0; i < 10; ++i) vec.push_back(i);
int count = 0;
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << "count = " << count++ << " *it = " << it << endl;
if (it % 2 == 0) {
vec.erase(it);
--it; // 因为 erase 会使迭代器失效,需要调整迭代器位置
}
}
for (auto v : vec) {
cout << "v = " << v << endl;
}
return 0;
}
这样修改后,您将能够正确输出迭代器指向的值,并且能正确删除偶数元素。注意,在删除元素后,需要通过减小迭代器的值 --it 来保持迭代的正确性,因为 erase 操作会使得迭代器失效。
查漏补缺[doge]:
cout << "count = " << count++ << " *it = " << *it << endl;