【问题标题】:string_view backed by a given string由给定字符串支持的 string_view
【发布时间】:2019-10-20 07:45:30
【问题描述】:

在 C++ 中,假设我从流中提取行,模仿 getline()。 每次我提取一行时,使用例如低级原语, 我还想创建一个由提取的字符串支持的string_views 向量。因此,本质上,我的方法将返回一个提取的字符串和一个由前者支持的string_views 向量。 如何做到这一点? 遵循相关代码sn -p:

bool Splitter( istream &is, string &backbone, vector<string_view> &words ) {
    int ch;
    words.clear(), backbone.clear();
    for ( ;(ch= is.get()) != EOF and ch != '\n'; backbone.push_back(ch) ) ;
    int i= 0, j, k= backbone.size();
#define skip_space(i) {for(;i < k and isspace(backbone.at(i)); ++i);}
    skip_space(i);
    assert( i == k or not isspace(backbone.at(i)) );
    for (;i < k; i= j ) {
        for ( j= i+1; j < k and not isspace(backbone.at(j)); ++j ) ;
        assert( j-i > 0 );
        words.emplace_back(backbone.substr(i,j==k?string::npos:j-i)); // <-- how to avoid creating a new string?
        skip_space(j);
    }
#if DBG
    cout << backbone << endl;
    for ( i= 0; i < words.size(); ++i )
        cout << words[i] << ", ";
    cout << endl;
#endif
    return not(ch == EOF and backbone.empty() and words.empty());
}

【问题讨论】:

    标签: c++ string-view


    【解决方案1】:

    您可以将backbone 包装在string_view 中,因为它的substr() 返回一个string_view(它也方便地公开at()),例如:

        ...
        string_view backbone_view(backbone);
        skip_space(i);
        assert( i == k or not isspace(backbone_view.at(i)) );
        for (;i < k; i= j ) {
            for ( j= i+1; j < k and not isspace(backbone_view.at(j)); ++j ) ;
            assert( j-i > 0 );
            words.emplace_back(backbone_view.substr(i,j==k?string::npos:j-i));
            skip_space(j);
        }
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多