2017-12-28 6 views
0

私はThe most elegant way to iterate the words of a stringを読んで答えの簡潔さを楽しんだ。今はstring_viewでも同じことをやりたい問題はstringstreamstring_viewを取ることができない、次のとおりです。idiomatically split a string_view

#include <iostream> 
#include <string> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

int main() { 
    using namespace std; 
    string_view sentence = "And I feel fine..."; 
    istringstream iss(sentence); // <== error 
    copy(istream_iterator<string_view>(iss), 
     istream_iterator<string_view>(), 
     ostream_iterator<string_view>(cout, "\n")); 
} 

だから、これを行う方法はありますか?もしそうでなければ、そんなことが慣用的ではないという理由は何でしょうか?

答えて

0

あなたがその特定のメソッドを使用する場合は、あなただけの明示的、stringstring_viewを変換する必要があります。

istringstream iss{string(sentence)}; // N.B. braces to avoid most vexing parse 
copy(istream_iterator<string>(iss), 
    istream_iterator<string>(), 
    ostream_iterator<string_view>(cout, "\n")); 

C++標準ライブラリには良いの文字列操作機能を持っていません。 BoostAbseilなどで利用可能なものを調べることができます。これらのいずれもこれより優れています。

0

stringstreamは、操作対象の文字列を所有しています。つまり、指定された文字列のコピーが作成されます。単に文字列を参照するだけではありません。

string_viewベースのstreamタイプでも、ストリームはまだランダムアクセス範囲ではありません。文字列の部分範囲を処理する方法はありません。そのため、イテレーターなどではなく、コピーによってストリームからデータを抽出します。

regexベースのメカニズムを使用すると、何もコピーせずに作業することができます。 string_viewで正常に動作します(string_viewを手動で構築する必要があります)。