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

10

Так как я не смог найти ничего по этому поводу вдокументацияЯ думал, я спрашиваю это здесь. У меня есть следующая программа (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)

Ваш Ответ

3   ответа
7

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

Вот

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

8

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

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

Ладно, я понял. Спасибо за указание на это. fdlm
Возможно, я не понимаю, но как я могу воссоздать & quot; #tag # tag1 # tag2 # tag3 #### tag4 & quot; из токенов ",", "тег", "тег1", "тег2", "тег3", "тег4", "" fdlm
@fdlm Это будет зависеть от формата вашей строки. Поведениеboost::split является довольно общим, но для некоторых пользователей они могут заботиться о сохранении конечных / ведущих символов, которые в противном случае были бы удалены путем разделения на них. В основном, если вам нужно, чтобы эти символы исчезли, вы должны быть явными и составлять функции вместе, которые делают то, что вы ожидаете.
1

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

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

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

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

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

Похожие вопросы