【问题标题】:Why is ranges::split_view not a Bidirectional Range?为什么 range::split_view 不是双向范围?
【发布时间】:2019-03-20 00:30:37
【问题描述】:

我正在使用 cmcstl2 库和带有 gcc 8 的 C++ 建议范围

std::string text = "Let me split this into words";
std::string pattern = " ";
auto splitText = text | ranges::view::split(pattern) | 
        ranges::view::reverse;

但这不起作用,因为视图只是一个前向范围而不是范围所需的双向范围(这是我认为正在发生的事情)。为什么?如果

text | ranges::view::split(pattern)

输出子范围的视图。不能颠倒这个观点吗?

同样在 cmcstl2 中,我必须执行以下操作才能将其打印出来。

for (auto x : splitText)
{
    for (auto m : x)
        std::cout << m;
    std::cout << " ";
}

但是在 range-v3/0.4.0 版本中我可以做到:

    for (auto x : splitText)
       std::cout << x << '\n';

为什么? x的类型是什么?

【问题讨论】:

  • "那个观点不能颠倒吗?" 但是你说它是一个 ForwardRange。根据定义,ForwardRange 只在一个方向。如果它可以倒退,那就是双向的。
  • 是的,但是为什么呢?为什么子范围视图的视图(如果是这样的话)不能是双向的?
  • 为什么你认为它与“子范围视图的视图”有什么关系,而不是它是一个字符串拆分视图,因此只向一个方向发展?
  • 并不是说(任意视图)不能是双向的。当然可以。这是特别 split_view 不是双向的(它只是一个ForwardRange)
  • 我只是想了解为什么 split_view 有这个限制。

标签: c++ range-v3


【解决方案1】:

它的编写方式仅支持 ForwardRange。

您当然可以尝试制作 BidirectionalRange 版本,尽管我怀疑这很难或不太通用。

考虑如何指定pattern 的所有选项,使其也可以向后匹配。

【讨论】:

  • 经过深思熟虑,我知道你来自哪里。在分配或范围期间评估视图表达式时,它必须先反转,然后评估模式,然后创建子范围。很难评估任何尺寸的向后看的前瞻模式。如果模式只有一个字符的长度,就像我的例子一样,这似乎更容易。
  • 就像我在上面发布的那样,这现在是 github 上的一个问题。所以也许这毕竟不是不可能的,只要输入范围是双向的。
  • @tcw321 我没有说不可能,只是当前实现只支持ForwardRange。猜测一下,如果附带实现,您的问题会做得更好。
  • 当然我明白目前的实现只支持ForwardRange。我从您的回答中误解了,如果我考虑模式的所有选项,则可能无法支持 ForwardRange 以外的任何东西。我的问题实际上是是否真的可以支持 BidirectionalRange。我希望通过在某个时候实现它来向自己证明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多