11

ドキュメントでこれについて何も見つけられなかったので、私はここでそれを尋ねると思いました。私は次のプログラム(C ++ 11)を持っています:

#include <iostream> 
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

int main () {
    string tmp = " #tag #tag1#tag2  #tag3 ####tag4   ";
    list<iterator_range<string::iterator> > matches;
    split( matches, tmp, is_any_of("\t #"), token_compress_on );

    for( auto match: matches ) {
            cout << "'" << match << "'\n";
    }
}

出力は次のとおりです。

''
'tag'
'tag1'
'tag2'
'tag3'
'tag4'
''

token_compress_onこのオプションはすべての空のトークンを削除すると思いました。解決策は、たとえば、を使用することboost::trim_ifです。それにもかかわらず、これがboost :: splitの望ましい動作であるかどうか、そしてなぜこれが起こっているのか疑問に思いました。

(g ++ 4.6.3、ブースト1.48)

4

3 に答える 3

8

分割バージョンから文字列(開始スペースと末尾スペースを含む)を再作成できるため、この動作は意図的なものです。Boostは、その空白が重要かどうかを認識しません(たとえば、一部のファイル形式では、先頭のスペース/特定のスペースの数が強制される場合があります)。

先頭/末尾のスペースを削除する必要がある場合は、そうする必要がありますtrim_iftrim

于 2012-05-03T18:46:00.803 に答える
8

eCompress引数がに設定されている場合token_compress_on、隣接する区切り文字は一緒にマージされます。それ以外の場合は、2つの区切り文字ごとにトークンを区切ります。

ここ

トークンは削除されず、マージされるだけです。

于 2012-05-03T18:56:00.040 に答える
2

boost::split常にn + 1トークンを返します。ここnで、は入力文字列の区切り文字の数です。したがって、空の文字列を渡したときに1つのトークンが返されても驚かないでください。

その背後にある理論的根拠は非常に単純です。CSVファイルを解析していると想像してください。最後のトークンが空であるかどうかに関係なく、まったく同じ数の要素を取得する必要があります。

空のトークンを削除する方が、結果に含まれるはずだったかどうかを推測するよりもはるかに簡単です。クレジット

この動作はPythonに似ています

>>> len("".split(','))
1
于 2017-01-12T01:52:10.920 に答える