03 мая 2012 г., 20:38 от fdlm

boost :: split оставляет пустые токены в начале и конце строки - это желаемое поведение?

Так как я не смог найти ничего по этому поводу вдокументацияЯ думал, я спрашиваю это здесь. У меня есть следующая программа (C ++ 11):

<code>#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";
    }
}
</code>

Выход:

<code>''
'tag'
'tag1'
'tag2'
'tag3'
'tag4'
''
</code>

Я бы подумал, чтоtoken_compress_on опция удаляет все пустые токены. Решение, например, использоватьboost::trim_if, Тем не менее мне было интересно, если это желаемое поведение boost :: split, и почему это происходит?

(g ++ 4.6.3, повышение 1.48)

Ответы на вопрос (0)

10 апр. 2013 г., 20:58 от andre

eCompress аргумент установлен вtoken_compress_onсоседние разделители объединяются. В противном случае каждые два разделителя разграничивают токен.

Вот

Он не удаляет токены, только объединяет их.

12 янв. 2017 г., 02:57 от Arun

boost::split всегда возвращаетсяn + 1 токены гдеn количество разделителей во входной строке. Так что не удивляйтесь, если он вернет 1 токен, когда вы передадите ему пустую строку.

Смысл этого довольно прост. Представьте, что вы анализируете файл CSV. Вам нужно получить одинаковое количество элементов независимо от того, пуст ли последний токен или нет.

Гораздо проще удалить пустые токены, чем угадать, должны ли они быть в результате или нет.кредит

Это поведение похоже на Python

>>> len("".split(','))
1
03 мая 2012 г., 20:46 от wkl

потому что вы можете воссоздать строку (с начальными и конечными пробелами) из разделенной версии. Boost не знает, является ли этот пробел значимым для вас или нет (это может быть, например, из-за того, что некоторые форматы файлов могут приводить к пробелам / определенному количеству пробелов).

Вам следуетtrim_if или жеtrim как и вы, если вам нужно удалить начальные / конечные пробелы.

ВАШ ОТВЕТ НА ВОПРОС