c boost разделить строку

#c #boost #split

#c #boost #разделить

Вопрос:

Я использую boost::split метод для разделения строки следующим образом:

Сначала я обязательно включаю правильный заголовок, чтобы иметь доступ к boost::split :

 #include <boost/algorithm/string.hpp>
  

затем:

 vector<string> strs;
boost::split(strs,line,boost::is_any_of("t"));
  

и строка похожа

 "test   test2   test3"
  

Вот как я использую вектор результирующей строки:

 void printstrs(vector<string> strs)
{
    for(vector<string>::iterator it = strs.begin();it!=strs.end();  it)
    {
        cout << *it << "-------";
    }

    cout << endl;
}
  

Но почему в результате strs я получаю только "test2" и "test3" , не должно быть "test" , "test2" и "test3" , в строке есть t (tab).

Обновлено 24 апреля 2011: Казалось, что после того, как я изменил одну строку кода в printstrs , я вижу первую строку. Я изменил

 cout << *it << "-------";
  

Для

 cout << *it << endl;
  

И, казалось, "-------" это каким-то образом охватывало первую строку.

Комментарии:

1. Покажите, как вы работаете с вектором. Я бы предположил, что проблема именно в этом.

2. boost::is_any_of("t") менее эффективен, чем [](char c) { return c=='t';} . Вы просто хотите проверить одну возможность. (Понятия не имею, почему этого нет boost:is('t') )

3. Что означает код в комментарии @MSalters? Как мне использовать этот код для замены boost::is_any_of() ?

4. @PoscoGrubb: Это называется «лямбда» и boost::splits понимает их.

Ответ №1:

Проблема где-то еще в вашем коде, потому что это работает:

 string line("testttest2ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("t"));

cout << "* size of the vector: " << strs.size() << endl;    
for (size_t i = 0; i < strs.size(); i  )
    cout << strs[i] << endl;
  

и тестирование вашего подхода, который использует векторный итератор, также работает:

 string line("testttest2ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("t"));

cout << "* size of the vector: " << strs.size() << endl;
for (vector<string>::iterator it = strs.begin(); it != strs.end();   it)
{
    cout << *it << endl;
}
  

Опять же, ваша проблема где-то в другом месте. Возможно, то, что вы считаете t символом в строке, таковым не является. Я бы наполнил код отладками, начав с мониторинга вставок в вектор, чтобы убедиться, что все вставляется так, как должно быть.

Выходной сигнал:

 * size of the vector: 3
test
test2
test3
  

Комментарии:

1. Мы больше ничего не можем для вас сделать, если вы не хотите поделиться минимальным примером, который воспроизводит проблему, с которой вы столкнулись. Помните: МИНИМАЛЬНЫЙ ПРИМЕР, а не ваше полное приложение.

2. Спасибо. казалось, я изменил cout<<*это<< «——-» для cout<<*it<<endl; Я вижу первую строку. Не уверен, почему, похоже, что «——-» покрыло первую строку

3. К вашему сведению, в этом примере используются следующие заголовки Boost: #include <boost/algorithm/string/split.hpp> и #include <boost/algorithm/string/classification.hpp>

4. Это не работает. Попробуйте string = «hih1ihi» и substring = «привет. Результат работы некорректен.

Ответ №2:

Мое лучшее предположение о том, почему у вас возникли проблемы с —— покрытием вашего первого результата, заключается в том, что вы фактически прочитали входную строку из файла. Вероятно, в конце этой строки был символ r, поэтому в итоге получилось что-то вроде этого:

-----------test2-------test3

Что произошло, действительно ли машина напечатала это:

test-------test2-------test3r-------

Это означает, что из-за возврата каретки в конце test3, тире после test3 были напечатаны поверх первого слова (и несколько существующих тире между test и test2, но вы бы этого не заметили, потому что они уже были тире).

Ответ №3:

 template <class Container>
void split1(const std::stringamp; str, Containeramp; cont)
{
   boost::algorithm::split_regex(cont, str, boost::regex("t"));
}

std::vector<std::string> vec1;
std::string str = "hest1twest2tpiest3";
split1(str, vec1);
  

vec == («hest1», «west2», «piest3»)