鱼C论坛

 找回密码
 立即注册
查看: 1442|回复: 6

[已解决]STL的迭代器问题

[复制链接]
发表于 2022-6-15 17:51:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问下下面三种遍历为什么都能输出答案,按道理来说指针指向的地址遍历的时候不是加了吗?怎么会回到第一个元素了?

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;

  5. void print(int val) {
  6.         cout << val << " ";
  7. }

  8. void test() {
  9.         vector<int> v;        // 创建 vector 容器对象,并通过模板参数指定容器中存放数据的类型

  10.         v.push_back(1);        // 向容器中放数据(尾插法)
  11.         v.push_back(2);
  12.         v.push_back(3);
  13.         v.push_back(4);
  14.         v.push_back(5);

  15.         /*        每个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
  16.                 v.begin() 返回迭代器,这个迭代器指向容器中第一个数据
  17.                 v.end() 返回迭代器,这个迭代器指向容器最后一个元素的下一个位置
  18.                 vector<int>::iterator 拿到 vector<int> 这种容器的迭代器类型
  19.         */

  20.         // 第一种遍历方法
  21.         vector<int>::iterator pBegin = v.begin();        // v.begin() 相当于指针
  22.         vector<int>::iterator pEnd = v.end();

  23.         while (pBegin != pEnd) {
  24.                 cout << *pBegin << " ";
  25.                 pBegin++;
  26.         }
  27.         cout << endl;

  28.         // 第二种遍历方法
  29.         for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  30.                 cout << *it << " ";
  31.         }
  32.         cout << endl;

  33.         // 第三种遍历方法
  34.         for_each(v.begin(), v.end(), print);
  35.         cout << endl;
  36. }

  37. int main() {
  38.         test();
  39.         return 0;
  40. }
复制代码
最佳答案
2022-6-16 08:25:54
a327904410 发表于 2022-6-16 00:30
它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变

假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后,q 指向的地址一样不变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-15 20:58:04 From FishC Mobile | 显示全部楼层
v.begin()    v.end()   这俩标志又没有动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 00:30:36 | 显示全部楼层
wp231957 发表于 2022-6-15 20:58
v.begin()    v.end()   这俩标志又没有动

它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-16 08:25:54 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
a327904410 发表于 2022-6-16 00:30
它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变

假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后,q 指向的地址一样不变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-16 08:46:56 From FishC Mobile | 显示全部楼层
a327904410 发表于 2022-6-16 00:30
它不是传了地址给pBegin吗?后面的++地址变了,按道理说它应该也会变

而且 v.begin() 和 v.end() 不是指针,而是函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 13:59:21 | 显示全部楼层
傻眼貓咪 发表于 2022-6-16 08:25
假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后 ...

这样的嘛,那是我理解错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 14:06:07 | 显示全部楼层
傻眼貓咪 发表于 2022-6-16 08:25
假设指针 p 指向 q 所指向的地址(现在 p 和 q 指向相同地址)
p++ 后,q 指向的地址不变
p++ 100 次后 ...

我可能把这个和 根据地址修改值导致原来指向该地址指针的值也会改变的概念 混淆了,仔细想想地址确实不会变。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 17:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表