Re: [stl] vector строчек из строки
От: zaufi Земля  
Дата: 01.12.06 14:00
Оценка: 7 (2)
Здравствуйте, ламмму, Вы писали:

Л>Привет!

Л>Вобщем есть текст(std::string) из нескольких строчек...
Л>как поэлегантней получить отдельные строки этого текста(т.е. из string получить vector<string> каждый елемент которого отдельная строкка текста (конец строки может быть как \n так и \r\n))

если lifetime непарсеного буфера дольше чем результирующего вектора то стоит задуматься о применении range'й вместа множественного копирования строк туда-суда-обратно...

#include <boost/range/iterator_range.hpp>
#include <boost/algorithm/string/split.hpp>
std::string buffer = get_text_with_crlf(...);
// ...
typedef std::vector<boost::iterator_range<std::string::const_iterator> > token_list_type;
token_list_type strings;
boost::algorithm::split(strings, buffer, is_any_of("\n\r"));


большенство функций из boost::algorithm принимают range'и.
некоторое время назад для одного проекта было написано 3 парсера какогота там конфига:
1) c использованием std::string::find()
2) с boost::toketizer
3) с iterator_range + boost::algorithm

делая одно и тоже парсеры показали заметно разные времена... (конкретных цифр к сожалению не помню):
в -O0 boost::tokenizer всех порвал в разы, а iterator_range проиграл к томуже еще и банальному find'у
но в -O3 картина кардинально изменилась: iterator_range уверено порвал ВСЕХ причем find'a в 12 раз!

после этого мы стали сильно любить iterator_rang'e для парса всяких стрингов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.