В C ++, предположим, я извлекаю строки из потока, имитируя getline()
. Каждый раз, когда я извлекаю строку, используя, например, низкоуровневые примитивы, я также хотел бы создать вектор string_view
s, подкрепленный извлеченной строкой. Так что, по сути, мой метод должен возвращать извлеченную строку и вектор string_view
с поддержкой первого. Как этого добиться? Следует соответствующий фрагмент кода:
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());
}