rangesv3 ts 中的 "range" 和 "view" 有什么区别?

What's the difference between a "range" and a "view" in the rangesv3 ts?

rangesv3 ts 中的 "range" 和 "view" 有什么区别?

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

'is-a' 视图范围是这种情况(用 c++ 来说),还是反之亦然?

难道仅仅是视图是只读范围?或者也许范围内的 "elements"(当你取消引用迭代器时得到的)在一个中是 const 而在另一个中不是?

谢谢!

来自文档,a range is

A range can be loosely thought of a pair of iterators, although they need not be implemented that way.

和:

A view is a lightweight wrapper that presents a view of an underlying sequence of elements in some custom way without mutating or copying it. Views are cheap to create and copy, and have non-owning reference semantics.

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

TS 中更正式的定义在 Range and View 概念中。基本上,范围是可以迭代的东西,视图是半规则的范围并且具有常数时间copy/move/assignment/begin/end/...

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


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

P2325 and other requirements were further relaxed in P2415.

取消了默认构造限制