#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»)