Задача следующая:
Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно?
Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.
Здравствуйте AlexTAI, Вы писали:
ATAI>Задача следующая: ATAI>Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно? ATAI>Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.
ATAI>Спасибо заранее.
А STL подойдет?
Просто у std::string есть метод void reserve(size_type Count = 0 );
который резервирует память заранее, т.е. при добавлении символов не будет происходит перераспределения памяти (пока конечно изначально зарезервированный буфер не исчерпается).
Здравствуйте AIDS, Вы писали:
AIDS>Здравствуйте AlexTAI, Вы писали:
ATAI>>Задача следующая: ATAI>>Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно? ATAI>>Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.
ATAI>>Спасибо заранее. AIDS>А STL подойдет? AIDS>Просто у std::string есть метод void reserve(size_type Count = 0 ); AIDS>который резервирует память заранее, т.е. при добавлении символов не будет происходит перераспределения памяти (пока конечно изначально зарезервированный буфер не исчерпается).
AIDS>HTH AIDS>AIDS
стоит проверки-хотя не уверен что он подойдет.
есть 2 основных требования:
1. все работает с юникодом.
2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".
Здравствуйте AlexTAI, Вы писали:
ATAI>есть 2 основных требования: ATAI>1. все работает с юникодом. ATAI>2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".
Здравствуйте Кодт, Вы писали:
К>Здравствуйте AlexTAI, Вы писали:
ATAI>>есть 2 основных требования: ATAI>>1. все работает с юникодом. ATAI>>2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".
К>Уже есть std::wstring — для юникода К>
Здравствуйте Кодт, Вы писали:
К>Здравствуйте AlexTAI, Вы писали:
ATAI>>Тогда еще один маленький вопрос — как перекопировать полученный список в wchar_t * Буффер поэффективнее.
К>Посчитать суммарную длину, выделить и поместить. К>
К>class wstrlist
К>{
К>// ... skipped ...
К>public:
К> size_t length() const
К> {
К> size_t l = 0;
К> list_t::const_iterator it = m_list.begin(), itEnd = m_list.end();
К> for(; it != itEnd; it++) l += it->length();
К> return l;
К> }
К> void export_buf(wchar_t* buffer) const// полагая, что размер буфера >= length() + 1
К> {
К> list_t::const_iterator it = m_list.begin(), itEnd = m_list.end();
К> for(; it != itEnd; it++)
К> {
К> wcscpy(buffer, it->c_str());
К> buffer += it->length();
К> }
К> }
К> // исправляю ошибку. здесь должен быть for а не while
К> void export(owstream& os) const
К> {
К> list_t::const_iterator it = m_list.begin(), itEnd = m_list.end();
К> for(; it != itEnd; it++) os << *it;
К> }
К>};
К>
К>Другую функциональность (копирование, очистку и т.д.) можно прикрутить по мере нужды.
Круто.
и... надеюсь последний вопрос(я только начал знакомиться с STL): если есть ошибки (например нехватка памяти) — как ловить ???
Здравствуйте AlexTAI, Вы писали: ATAI>стоит проверки-хотя не уверен что он подойдет. ATAI>есть 2 основных требования: ATAI>1. все работает с юникодом. ATAI>2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".
1. Можно использовать std::wstring
2. В VC 6.0 по умолчанию string и wstring увеличиваются в размере при необходимости сразу на 32 символа (или больше). Можно более эффективно сделать это с помощью reserve().
Здравствуйте AlexTAI, Вы писали:
ATAI>Задача следующая: ATAI>Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно? ATAI>Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.
ATAI>Спасибо заранее.