4

rangev3 ts 中的“范围”和“视图”有什么区别?

在 G 搜索中找不到任何类似的答案。猜猜我正在努力了解每个人应该做什么的基本概述:

范围'is-a'视图是否是这种情况(在c ++中),反之亦然?

仅仅是视图是只读范围吗?或者,范围中的“元素”(当您取消引用迭代器时得到的)在一个中是 const 而不是另一个?

谢谢!

4

1 回答 1

10

从文档中,范围是

范围可以松散地认为是一对迭代器,尽管它们不需要以这种方式实现。

和:

视图是一个轻量级的包装器,它以某种自定义方式呈现底层元素序列的视图,而无需对其进行变异或复制。视图的创建和复制成本很低,并且具有非拥有引用语义。

视图一个范围,只是有更多的限制。

TS 中更正式的定义在RangeView概念中。基本上,一个范围是可以迭代的,而一个视图是一个半规则的范围†</sup>并且具有恒定的时间复制/移动/分配/开始/结束/...

例如,std::vector<char>std::stringstd::string_view都是范围,但只有最后一个也是视图。


†</sup> 虽然在 Ranges TS 中,视图始终是半规则的,但此限制在P1456中放宽了。在 C++20 中,View 只需要默认可构造且‡</sup> 可移动。额外的语义约束(所有‡</sup>操作都是常数时间)仍然成立。值得注意的是:虽然 View 不需要是可复制的,但如果它是可复制的,那么那些复制操作仍然需要花费恒定的时间。

‡</sup> P2325中取消了默认施工限制,P2415中进一步放宽了其他要求。

于 2018-03-02T21:28:25.583 回答