【发布时间】: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 有这个限制。