如何将一个std::string切割成一系列(v3)的std::string_views?

17

我需要在所有空格处分割一个 std::string。然而,结果范围应该将其元素转换为 std::string_view。我正在处理范围的“元素类型”。我猜想,该类型类似于 c_str。如何将“分割”部分转换为 string_view

#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);
}
1个回答

29

这里的问题之一是ranges::view::split返回一个范围的范围,而你不能直接从范围构造一个std::string_view

你想要的是这样的东西:

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的大小。

最终的“view”可能是单个元素的“string_view”。 - P0W
1
@P0W 不!split并不会“返回”一个字符范围,它返回的是一个范围的范围,因此每个rng本身都是一个范围,对应于s中的一个单词(一对迭代器到s),这就是为什么我可以从中构造一个std::string_view - Holt
7
感谢提供P1989R2P2210R2return std::string_view(&*rng.begin(), ranges::distance(rng));可以简化为return std::string_view(r); - 康桓瑋

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接