在 C++中 pointer 与 iterator 的区别是什么?

2017-03-24 22:12:06 +08:00
 mhjyzs

一个 pointer 是一个 iterator 吗?

3106 次点击
所在节点    问与答
32 条回复
pagict
2017-03-24 22:48:10 +08:00
我理解为 iterator 是 pointer 的 wrapper , iterator 可 next(), 可边界检查 etc
sagaxu
2017-03-24 22:57:44 +08:00
完全不相似的两个东西,也能比较出区别来?
mhjyzs
2017-03-24 23:05:03 +08:00
@sagaxu 请说出你的理由!?
sagaxu
2017-03-24 23:12:50 +08:00
@mhjyzs pointer 是对虚拟内存地址的寻址,迭代器是一种遍历访问接口,毫不相干。你觉得这两者有相同点?
htfy96
2017-03-24 23:13:30 +08:00
iterator 是一个概念,指的是一类类型,只要支持++, *等操作的类型都能被称为 iterator: http://en.cppreference.com/w/cpp/concept/Iterator
一般所说 pointer 基本满足 iterator 的要求
HenryKCU
2017-03-24 23:29:54 +08:00
就好像火药和炸药的区别,完全不是一个东西
mhjyzs
2017-03-24 23:56:44 +08:00
@htfy96 意思是 pointer 是一个 iterator, 但是 iterator 是一个更大的概念。
nicevar
2017-03-25 00:02:09 +08:00
@mhjyzs 上面的兄弟白跟你解释了啊,简单点理解指针就是一个内存地址,内存地址你总知道了吧,真的是与 iterator 没啥关系
wwqgtxx
2017-03-25 00:15:27 +08:00
pointer 是一个基础类型
iterator 是一个重载了运算符的类
这就是他们最大的区别
lcdtyph
2017-03-25 00:23:16 +08:00
迭代器是指针的泛化。
kmyzzy
2017-03-25 00:34:49 +08:00
这俩根本就没关系
mhjyzs
2017-03-25 08:25:18 +08:00
@lcdtyph 嗯嗯,我比较同意这个说法.
mhjyzs
2017-03-25 08:29:45 +08:00
@HenryKCU 你确定火药和炸药完全不是一个东西?
j5shi
2017-03-25 08:50:14 +08:00
@HenryKCU 所以火药不能当炸药?
htfy96
2017-03-25 08:55:52 +08:00
@nicevar @wwqgtxx 重复一下, iterator 和重没重载运算符、底层是啥真没关系,只要满足操作就行。所以普通的 pointer 也是 iterator ,一个例子就是 std::find 这类标准库算法也能接受指针作为输入
wwqgtxx
2017-03-25 09:08:21 +08:00
@htfy96 那就看你怎么理解了,从面向对象的角度考虑,指针并不是一个 iterator ,因为 pointer 不是 iterator 的子类,不过你要是从范化的概念上说,也可以这么理解
mhjyzs
2017-03-25 09:08:45 +08:00
@htfy96 @nicevar 我也是看见 remove_copy_if 这个前两个参数是接受 iterator,但是传入 pointer 也是正确的,所以我才疑惑 pointer 是不是一个 iterator .可以看这 http://www.cplusplus.com/reference/algorithm/remove_copy_if/?kw=remove_copy_if
htfy96
2017-03-25 09:28:29 +08:00
@wwqgtxx C++在这块是 duck typing ,不需要显式继承某个接口
radiolover
2017-03-25 09:33:27 +08:00
iterator 是类,有一个指针成员,所以 sizeof(pointer) = sizeof(iterator object)
iterator 重载了++,*等操作,所以行为看上去像指针。
wwqgtxx
2017-03-25 09:35:12 +08:00
@htfy96 那其实也是用模板来范化而已,从概念上说,个人还是喜欢严格的继承型接口,不过对于 c++这种静态语言的确差异不大, golang 的接口也是这么干的,只不过他才是真正的 duck typing ,因为他的接受类型是一个真真正正的 interface ,而不是没有约束的模板

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350142

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX