【问题标题】:How to split a std::string into a range (v3) of std::string_views?如何将 std::string 拆分为 std::string_views 的范围(v3)?
【发布时间】:2018-01-23 13:09:13
【问题描述】:

我需要在所有空格处拆分 std::string。然而,结果范围应将其元素转换为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);
}

【问题讨论】:

    标签: c++ string range-v3 string-view


    【解决方案1】:

    (其中一个)问题是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));
    });
    

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

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

    【讨论】:

    • 最终的view 可能是单个元素的string_view
    • @P0W 不! split 不“返回”一个字符范围,它返回一个范围范围,所以每个rng 本身就是一个字符范围,对应于s 中的一个单词(一对s) 的迭代器,这就是为什么我可以从中构造一个 std::string_view
    • 感谢P1989R2P2210R2return std::string_view(&amp;*rng.begin(), ranges::distance(rng)); 可以简化为return std::string_view(r);
    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2016-08-17
    • 2019-07-12
    • 2015-01-07
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多