boost :: split在字符串的开头和结尾留下空标记 - 这是期望的行为吗?

时间:2012-05-03 18:38:31

标签: c++ boost c++11 split

由于我在documentation找不到任何内容,我想我在这里问。我有以下程序(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,boost 1.48)

3 个答案:

答案 0 :(得分:8)

该行为是故意的,因为您可以从拆分版本重新创建字符串(包括起始和尾随空格)。 Boost不知道这个空白是否对你很重要(例如,某些文件格式可能会强制导致空格/特定空间计数)。

如果您确实需要删除前导/尾随空格,则应该trim_iftrim

答案 1 :(得分:7)

如果eCompress参数设置为token_compress_on,则相邻的分隔符将合并在一起。否则,每两个分隔符都会分隔一个标记。

Here

它不会删除令牌只合并它们。

答案 2 :(得分:1)

boost::split始终返回n + 1个标记,其中n是输入字符串中的分隔符数。因此,当你传递一个空字符串时它会返回1个令牌时不会感到惊讶。

背后的基本原理非常简单。想象一下,您正在解析CSV文件。无论最后一个令牌是否为空,您都需要获得完全相同数量的元素。

删除空标记比猜测它们是否应该在结果中更容易。 Credit

此行为类似于python

>>> len("".split(','))
1