如何将 std::string 拆分为 std::string_views 的范围 (v3)?

How to split a std::string into a range (v3) of std::string_views?

我需要在所有空格处拆分一个 std::string。然而,结果范围应该将它的元素转换为 std::string_views。我正在为范围的 "element type" 苦苦挣扎。我猜,类型类似于 c_str。如何将 "split" 部分转换为 string_views?

#include <string>
#include <string_view>
#include "range/v3/all.hpp"

int main()
{
    std::string s = "this should be split into string_views";

    auto view = s 
            | ranges::view::split(' ') 
            | ranges::view::transform(std::string_view);
}

(其中一个)这里的问题是 ranges::view::split returns 一个范围 of ranges, 你不能直接构造一个 std::string_view来自一个范围。

你想要这样的东西:

auto view = s
    | ranges::views::split(' ')
    | ranges::views::transform([](auto &&rng) {
            return std::string_view(&*rng.begin(), ranges::distance(rng));
});

可能有 better/easier 方法可以做到这一点,但是:

  • &*rng.begin()会给你原始字符串.
  • 中块的第一个字符的地址
  • ranges::distance(rng) 会给你这个块中的字符数。请注意,这比 ranges::size 慢,但这里是必需的,因为我们无法在恒定时间内检索 rng 的大小。