rangev3 ts 中的“范围”和“视图”有什么区别?
在 G 搜索中找不到任何类似的答案。猜猜我正在努力了解每个人应该做什么的基本概述:
范围'is-a'视图是否是这种情况(在c ++中),反之亦然?
仅仅是视图是只读范围吗?或者,范围中的“元素”(当您取消引用迭代器时得到的)在一个中是 const 而不是另一个?
谢谢!
从文档中,范围是:
范围可以松散地认为是一对迭代器,尽管它们不需要以这种方式实现。
和:
视图是一个轻量级的包装器,它以某种自定义方式呈现底层元素序列的视图,而无需对其进行变异或复制。视图的创建和复制成本很低,并且具有非拥有引用语义。
视图是一个范围,只是有更多的限制。
TS 中更正式的定义在Range和View概念中。基本上,一个范围是可以迭代的,而一个视图是一个半规则的范围†</sup>并且具有恒定的时间复制/移动/分配/开始/结束/...
例如,std::vector<char>
、std::string
和std::string_view
都是范围,但只有最后一个也是视图。
†</sup> 虽然在 Ranges TS 中,视图始终是半规则的,但此限制在P1456中放宽了。在 C++20 中,View 只需要默认可构造且‡</sup> 可移动。额外的语义约束(所有‡</sup>操作都是常数时间)仍然成立。值得注意的是:虽然 View 不需要是可复制的,但如果它是可复制的,那么那些复制操作仍然需要花费恒定的时间。
‡</sup> P2325中取消了默认施工限制,P2415中进一步放宽了其他要求。