Я некоторое время исследовал здесь, в StackOverflow, чтобы найти хорошие алгоритмы для разделения строк с несколькими разделителями на vector< string >
.Я также нашел несколько методов:
Способ Boost:
boost::split(vector, string, boost::is_any_of(" \t"));
Метод getline
:
std::stringstream ss(string);
std::string item;
while(std::getline(ss, item, ' ')) {
vector.push_back(item);
}
токенизированный способ Boost:
char_separator<char> sep(" \t");
tokenizer<char_separator<char>> tokens(string, sep);
BOOST_FOREACH(string t, tokens)
{
vector.push_back(t);
}
и классный способ STL:
istringstream iss(string);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter<vector<string> >(vector));
и метод Shadow2531 (см. Связанную тему).
Большинство из них пришли из из этой темы .Но они, к сожалению, не решают мою проблему:
Сплит Boost прост в использовании, но с большими данными (около 1,5 * 10 ^ 6 отдельных элементов в лучших случаях) и около 10 разделителейЯ использую это ужасно медленно.
Метод getline
, STL и Shadow2531 имеет проблему, заключающуюся в том, что я могу использовать только один символ в качестве разделителя.Мне нужно еще немного.
Токенизация Boost еще более ужасна в аспекте скорости.Чтобы разделить строку на 1,5 * 10 ^ 6 элементов, потребовалось 11 секунд с 10 разделителями.
Так что я не знаю, что делать: я хочу сделать действительно быстрое разбиение строкиалгоритм с несколькими разделителями.
Максимальное разделение Boost или есть способ сделать это быстрее ?