【问题标题】:Can you zip with the new ranges library?你能用新的范围库压缩吗?
【发布时间】:2019-07-10 01:06:47
【问题描述】:

见:http://eel.is/c++draft/#ranges

给定两个 C++2a 范围(如在符合范围库的范围概念的对象中)a 和 b,长度相等,有没有办法将它们压缩在一起:

for (const auto& [a,b] : zip(a,b))

符合您的期望吗?也就是说,它返回一个具有可破坏绑定对的范围:

(a.begin(), b.begin())
(a.begin()+1, b.begin()+1)
(a.begin()+2, b.begin()+2)
...
(a.end()-1, b.end()-1)

【问题讨论】:

  • Zip 请教什么??根据需要发布一个独立的问题。
  • 你期待什么?
  • 你的意思是像 Python zip?

标签: c++ c++20 std-ranges


【解决方案1】:

如您所见,目前 C++20 中没有 zip_view(在撰写本文时)。

它是在P1035R4(以及一些其他适配器)中提出的,其先前的版本在圣地亚哥受到好评,并且似乎很有可能在 C++20 中登陆。关于代理引用有一些悬而未决的问题,但我认为这不是 zip 特有的。


那些关于代理引用的问题最终导致zip 从 P1035 中删除,并且没有被 C++20 采用。相反,zip 被提议用于 C++23,作为 P2321 的一部分(其中还包括对我提到的代理引用更改种类的描述)。

【讨论】:

  • 为什么示例是for (auto xy = view::zip(x, y); auto [xi, yi] : xy) 而不是for (auto [xi, xi] : xy)
  • @AndrewTomazos 你的意思是为什么不是for (auto [xi, yi] : view::zip(x, y))?只是口味问题,两者是等价的。
  • Barry 可能会更新答案说计划的标准现在是 C++23
  • @NoSenseEtAl 完成。
【解决方案2】:

ranges v3 niebler 已经公开了一个带有惰性 zip 和一些更通用形式的库,还有 zip_view 和其他形式。实现为仅标头库,因此您可以阅读代码。有一些很好的使用例子。 在 c++ 中,当被询问时,zip 可能会返回一个元组。并索引到该元组将为您提供值。

【讨论】:

  • 是的,range-v3 是 C++20 中的 std 范围所基于的...但它还没有(还)迁移 zip
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多