由给定字符串支持的 string_view
Posted
技术标签:
【中文标题】由给定字符串支持的 string_view【英文标题】:string_view backed by a given string 【发布时间】:2019-10-20 07:45:30 【问题描述】:在 C++ 中,假设我从流中提取行,模仿 getline()
。
每次我提取一行时,使用例如低级原语,
我还想创建一个由提取的字符串支持的string_view
s 向量。因此,本质上,我的方法将返回一个提取的字符串和一个由前者支持的string_view
s 向量。
如何做到这一点?
遵循相关代码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());
【问题讨论】:
【参考方案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);
...
【讨论】:
以上是关于由给定字符串支持的 string_view的主要内容,如果未能解决你的问题,请参考以下文章
使用 std::string_view 的子字符串控制台输出 [关闭]