首页 新闻 会员 周边 捐助

vector迭代器

0
悬赏园豆:5 [已解决问题] 解决于 2023-06-06 23:36

为什么输出中&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
Veritas_des_Liberty的主页 Veritas_des_Liberty | 初学一级 | 园豆:190
提问于:2023-06-06 17:51
< >
分享
最佳答案
0

在您的代码中,&it 是输出迭代器 it 的地址,而迭代器是一个对象,其地址在循环中没有发生变化是正常的。

在 for 循环中,每次迭代都会创建一个新的迭代器对象,并将其初始化为容器的 begin 位置。因此,&it 输出的是每个迭代器对象的地址,并不代表迭代器的值。

如果您想输出迭代器指向的值,可以使用 *it,而不是 &it。以下是修改后的代码示例:

cpp
Copy code

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);
--it; // 因为 erase 会使迭代器失效,需要调整迭代器位置
}
}

for (auto v : vec) {
cout << "v = " << v << endl;
}

return 0;
}
这样修改后,您将能够正确输出迭代器指向的值,并且能正确删除偶数元素。注意,在删除元素后,需要通过减小迭代器的值 --it 来保持迭代的正确性,因为 erase 操作会使得迭代器失效。

收获园豆:5
Technologyforgood | 大侠五级 |园豆:7541 | 2023-06-06 23:14

查漏补缺[doge]:

cout << "count = " << count++ << " *it = " << *it << endl;

Veritas_des_Liberty | 园豆:190 (初学一级) | 2023-06-06 23:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册