C++ Vector的iterator,自增操作++与+1的区别?如何理解?

小飞侠0070 2016-05-15 02:30:32
今天小弟看c++ premier时候,看到swap两个同类型的顺序容器,迭代器不会失效。
回来验证了下,发现果然如书上所说,但是验证过程中发现另一个问题。
代码如下:
#include <iostream>
#include<vector>
using namespace std;
using std::vector;
int main() {
vector<int> v1{ 0, 1 };
vector<int> v2{ 2, 3 };
auto p1 = v1.begin();
auto p2 = p1++;
auto p3 = v2.begin();
auto p4 = p3++;
cout << *p1 <<" " <<*p2<<" "<< *p3 <<" "<<*p4<< endl;
//cout << *(v1.begin()) << " " << *(v2.begin()) << endl;
system("pause");
return 0;
}

输出结果为 1 0 3 2;
表示有一些困惑,*p2=1可以理解,不太清除为何*p1=0,++使p1指向了第二个数,不太清楚逻辑,换句话说迭代器是不是和指针比较类似?
...全文
1460 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
小飞侠0070 2016-05-19
  • 打赏
  • 举报
回复
引用 6 楼 huatian5 的回复:
迭代器定义的就是一个指针,利用指针的移动从而访问容器中的元素。 oh my god!!! 我发现你的问题了,问题不是处在迭代器,而是++上。 你原来用 auto p1 = v1.begin(); auto p2 = p1++; p2指向了原来p1指向的位置,因为现在p1++=p1,然后p1++后,p1指向了v1.begin()的下一位。 你还是没怎么理解自增自减和指针的使用啊,加油吧
谢谢 的确是这样。
小飞侠0070 2016-05-19
  • 打赏
  • 举报
回复
一开始对auto p2=p1++的理解,总是不能够理解解引用p1为什么会得到1,今天重看了下书发现可以这样理解。 auto p2=p1; p1=p1+1; 由于递增迭代器会指向下一个迭代器,因此自增后会指向原来p2的位置,解引用得到1. 谢谢大家
小灸舞 2016-05-19
  • 打赏
  • 举报
回复
引用 11 楼 mawu_1014 的回复:
[quote=引用 3 楼 qq423399099 的回复:] 指针是一种特殊的变量,它专门用来存放另一变量的地址,而迭代器只是参考了指针的特性进行设计的一种STL接口。 笔者曾在网上看到这样一种说法:迭代器是广义指针,而指针满足所有迭代器要求。迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。
换句话说,可以认为指针和迭代器是有某种关系的(当然我没有看过stl,不知道具体是什么样的)。所以递增迭代器实际和递增指针一样,会指向下一个元素,可以这样理解吗?[/quote] 可以
小飞侠0070 2016-05-19
  • 打赏
  • 举报
回复
引用 10 楼 zhang_qi123 的回复:
这个完全是你没有理解前++与后++的区别,后++是不改便当前的值,过后再改变,所以你的运行结果是那样的!
这个我还是清楚的,主要是不知道迭代器和指针的关系,不清楚对于迭代器递增的作用。不过现在清楚了谢谢大家
小飞侠0070 2016-05-19
  • 打赏
  • 举报
回复
引用 3 楼 qq423399099 的回复:
指针是一种特殊的变量,它专门用来存放另一变量的地址,而迭代器只是参考了指针的特性进行设计的一种STL接口。 笔者曾在网上看到这样一种说法:迭代器是广义指针,而指针满足所有迭代器要求。迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。
换句话说,可以认为指针和迭代器是有某种关系的(当然我没有看过stl,不知道具体是什么样的)。所以递增迭代器实际和递增指针一样,会指向下一个元素,可以这样理解吗?
lm_whales 2016-05-18
  • 打赏
  • 举报
回复
printf("%d",a); 这个表达式的作用是,就是计算返回值,也就是计算输出了多少对象吧。 这点等会再查查
lm_whales 2016-05-18
  • 打赏
  • 举报
回复
加1 不是自修改的,要变成自修改,还需要赋值给自己 n=n+1 ; n+=1 ; 可以实现自加 操作 两个自增运算,都可以直接实现自修改 n++; ++n; 然而 C,C++有一点比较特殊 那就是,每个表达式 都有一个值, 求这个值是表达式的正作用。 自增表达式中,自增则是副作用。 这一点,有点违背直觉 我们可能会认为 n++的作用是 让n自增 然而 C,C++ n++ 这个表达式的值 是多少,才是n++ 这个表达式的主要作用 自增么,只是附带的计算了一下, 是求n++的时候,捎带计算一下而已。 类似的还有 cout<< x;这个表达式, 是计算 cout<<x;的结果 。。。。值是 cout(的引用) 副作用是输出 x 的值。 函数调用表达式中,一切 输入输出,以及状态的修改。都是副作用 例如 printf("%d",a); 这个表达式的作用是,就是计算返回值,也就是计算输出了多少字符。 副作用是在屏幕上显示 a 的值。
zhang_qi123 2016-05-18
  • 打赏
  • 举报
回复
这个完全是你没有理解前++与后++的区别,后++是不改便当前的值,过后再改变,所以你的运行结果是那样的!
月凉西厢 2016-05-18
  • 打赏
  • 举报
回复
很多版本的迭代器的内部实现就是指针,只是限制了指针的功能
huatian5 2016-05-15
  • 打赏
  • 举报
回复
迭代器定义的就是一个指针,利用指针的移动从而访问容器中的元素。 oh my god!!! 我发现你的问题了,问题不是处在迭代器,而是++上。 你原来用 auto p1 = v1.begin(); auto p2 = p1++; p2指向了原来p1指向的位置,因为现在p1++=p1,然后p1++后,p1指向了v1.begin()的下一位。 你还是没怎么理解自增自减和指针的使用啊,加油吧
paschen 版主 2016-05-15
  • 打赏
  • 举报
回复
哪里不能理解,++后,p1指向了第二个元素,也就是1
赵4老师 2016-05-15
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
小灸舞 2016-05-15
  • 打赏
  • 举报
回复
指针是一种特殊的变量,它专门用来存放另一变量的地址,而迭代器只是参考了指针的特性进行设计的一种STL接口。
笔者曾在网上看到这样一种说法:迭代器是广义指针,而指针满足所有迭代器要求。迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。
dustpg 2016-05-15
  • 打赏
  • 举报
回复
因为指针太强大了,迭代器限制了一下功能,方便代码的编写,还能查错。 比如begin返回的迭代器再--的话,调试模式下一般会被截断,而指针完全合法。
小飞侠0070 2016-05-15
  • 打赏
  • 举报
回复
错了,是*p2=0可以理解

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧