【问题标题】:What's the difference between a "range" and a "view" in the rangesv3 ts?rangev3 ts 中的“范围”和“视图”有什么区别?
【发布时间】:2018-03-02 21:15:36
【问题描述】:

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

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

是否是范围“is-a”视图的情况(在 c++ 中),反之亦然?

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

谢谢!

【问题讨论】:

标签: c++ range-v3


【解决方案1】:

来自文档,a range is

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

和:

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

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

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

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


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

P2325 中取消了默认构造限制,P2415 中进一步放宽了其他要求。

【讨论】:

  • “视图是一个半规则的范围,并且具有恒定的时间复制/移动/分配。”和begin/end所有 View 所需的操作都必须是 O(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2013-08-19
  • 2012-12-11
  • 2015-09-22
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多