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

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

一个 pointer 是一个 iterator 吗?

3114 次点击
所在节点    问与答
32 条回复
htfy96
2017-03-25 09:54:02 +08:00
@wwqgtxx 其实 C++也可以用 SFINAE 等奇怪的技巧来约束类型…要是 concept 进 C++20 了就能用类似的语法了
starvedcat
2017-03-25 10:08:50 +08:00
问:火车和汽车有什么区别?
答:这两种东西完全没关系!(有什么区别?不告诉你,呵呵)
nicevar
2017-03-25 10:37:09 +08:00
@mhjyzs 我看大家再解释下去你更晕了, iterator 用起来像指针,但是操作不是指针操作,它是个 object ,它那些操作都是通过重载实现的,你要真认为 iterator 是指针的话,用 c 语言的观点来强行看就是了
SuperFashi
2017-03-25 10:51:50 +08:00
iterator 是 pointer 的超集, pointer 是一种 random iterator 。
mhjyzs
2017-03-25 11:01:19 +08:00
@nicevar 我是认为 pointer 是一个 iterator.
k9982874
2017-03-25 12:24:57 +08:00
9 楼 10 楼正解。举个不恰当但是能说明问题的例子 java 中的 int 和 integer 。
FrankHB
2017-03-25 13:18:08 +08:00
C++所谓的 pointer 可以有多种含义。
一类是从 C 照搬的 pointer ,是一类内建类型。
另一类是库中约定的泛化的 pointer ,如满足标准 NullablePointer requirements 的类型(例如 unique_ptr 的实例)。这些类型往往也被直接称为 pointer ,如 smart pointer 。严格来说这些类型只是 pointer-like ,限制比内建 pointer 小,除了 CopyConstructible 之类的语义约定外,通常只要求特定的*或->操作之一(连这些操作都没有的一般称为 handler )。
iterator 是指库(如 SGI 或标准库)约定的概念,一般指满足标准 Iterator requirements 的类型。这对右值 r 只要求*r 和++r ,限制同样比无论哪种 pointer 都小得多。
在标准库的框架中,内建的 pointer 是 random access iterator ,然后可以很容易推出 pointer 是 iterator :
random access iterator 是 bidirectional iterator ;
bidirectional iterator 是 forward iterator ;
forward iterator 是 input iterator ;
input iterator 是 iterator 。
Q.E.D.
反过来不成立。
至于其它意义上的 pointer ,连++都不保证有,就自然不是 iterator 了。

@pagict 看清楚标题。
C++的 iterator 哪来的 next()。
@sagaxu 关虚拟地址毛线?
unique_ptr 跟地址有一腿?
逻辑地址和物理地址就不能跟 pointer 有一腿?
@nicevar 哪个语言的指针是所谓的内存地址?
FrankHB
2017-03-25 13:29:09 +08:00
@htfy96 不要看上去 duck 就 duck 了。 Duck typing 是把类型检查推迟到运行时,而 C++这里明显不是。这叫 structural typing ,对立的是 nominal typing 。
@wwqgtxx golang 那也是 structural typing ,而且用户无法自主编码类型检查规则。
@starvedcat 火焰猫燐是一只火车然而不是汽车……(
wwqgtxx
2017-03-25 13:41:12 +08:00
@FrankHB 谁说 golang 不可以自主编码类型检测规则的,你直接用反射检测一下不就行了
FrankHB
2017-03-25 13:52:47 +08:00
@wwqgtxx 用 reflection 实现 type introspection 编码的可不是 typechecking rules 。
mhjyzs
2017-03-25 14:10:38 +08:00
@FrankHB 谢谢解释得这么清楚.
sagaxu
2017-03-25 16:50:53 +08:00
@FrankHB 泛化的讲也没错, smart pointer 也算 pointer 的一种。 raw pointer ,在常见平台上,还是对应到虚拟地址空间的,不然 mmap 这样的地址映射是没法实现的。

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

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

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

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

© 2021 V2EX