代码之家  ›  专栏  ›  技术社区  ›  Tony Tannous

C++如何使用视图打印文字::拆分?

  •  0
  • Tony Tannous  · 技术社区  · 4 年前

    在里面 p0896r4

    1. split\u view获取一个视图和一个分隔符,并将视图拆分为 分隔符上的子范围。分隔符可以是单个元素或 元素视图。

    #include <iostream>
    #include <ranges>
    #include <string>
        
    int main()
    {
        std::string str{"the quick brown fox"};
        std::ranges::split_view sentence{str, ' '};
        for (auto word : sentence) {
            for (char ch : word)
                std::cout << ch;
            std::cout << "*";
        }
        return 0;
    }
    

    输出:

    the*quick*brown*fox*
    

    然而,这是逐字符打印,为什么我不能打印一个单词呢?

    for (auto word : sentence) 
        std::cout << word << std::endl;
    

    错误: https://godbolt.org/z/GsPrhz

    <source>:10:19: error: no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'std::ranges::split_view<std::ranges::ref_view<std::__cxx11::basic_string<char> >, std::ranges::single_view<char> >::_OuterIter<true>::value_type')
    

    问题:我可以打印文字吗?或者 std::ranges::single_view<char> 摆出一个约束?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Barry    4 年前

    没有一个标准视图是可打印的,所以简单的回答是基本上不能打印。我们希望改变这一点,作为 P2214

    views::split 特别是有一个问题,你甚至不能从中得到一个连续的子范围,所以你不能有意义地转换你得到的片段 string_view 要么是。这是 P2210

    fmt 图书馆 lets you write

    char const* delim = "";
    for (auto word : sentence) {
        fmt::print("{}{}", delim, fmt::join(word, ""));
        delim = " ";
    }
    

    我不认为 fmt公司 有任何范围的连接范围的支持,所以我做了手动定界。


    single_view<char> 是你分裂的模式,而不是你从中得到的东西 split .