14

我需要std::string在所有空格处拆分 a 。然而,结果范围应将其元素转换为std::string_views。我正在为范围的“元素类型”而苦苦挣扎。我猜,类型类似于c_str. 如何将“拆分”部分转换为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);
}
4

1 回答 1

19

(其中一个)问题是ranges::view::split返回范围的范围,并且您不能std::string_view直接从范围构造 a 。

你想要这样的东西:

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

可能有更好/更简单的方法来做到这一点,但是:

  • &*rng.begin()将为您提供原始字符串中块的第一个字符的地址。
  • ranges::distance(rng)会给你这个块中的字符数。请注意,这比ranges::size这里需要的要慢,因为我们无法rng在恒定时间内检索 的大小。
于 2018-01-23T13:42:36.593 回答