string_view由给定字符串支持
string_view backed by a given string
在C++中,假设我从流中提取行,模仿getline()
。 每次我提取一行时,例如使用低级基元, 我还想创建一个由提取的字符串支持的string_view
s 向量。因此,从本质上讲,我的方法将返回一个提取的字符串和一个由前者支持的string_view
s 向量。 如何实现这一点? 遵循相关代码片段:
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());
}
您可以将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);
}
...
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 将字符串存储在c++中的稳定内存中
- 编译时未启用intel oneApi CUDA支持
- 编译包含字符串的代码时遇到问题
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- string_view由给定字符串支持
- GCC是否支持宏定义中的多行原始字符串文字
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- 如何支持any_cast将自定义类强制转换为字符串
- 不能直接在 C++ 中支持简洁的 int 和字符串?
- 为什么字符串支持`operator=(char)`
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- C++参数支持字符串和整数的结构
- 字符串到浮点的转换,同时支持小数点和小数逗号
- 字符串变量.open支持预定的字符串变量
- 如何将c++中的wchar字符串转换为更好支持的东西
- Android c++支持to_string, stof等字符串
- Visual Studio 2010是否支持Unicode中的C++源代码和字符串文字中的Unicode字符
- Visual Studio 2010 上的C++:无法将字符串分配给字符串(不支持混合类型)
- c++ 11和c++ 03在支持std::string的小字符串优化方面有所不同