Нужен совет
От: AlexTAI alextai.narod.ru
Дата: 18.08.02 19:46
Оценка:
Задача следующая:
Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно?
Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.

Спасибо заранее.
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re: Нужен совет
От: AIDS Великобритания  
Дата: 18.08.02 21:33
Оценка:
Здравствуйте AlexTAI, Вы писали:

ATAI>Задача следующая:

ATAI>Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно?
ATAI>Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.

ATAI>Спасибо заранее.

А STL подойдет?
Просто у std::string есть метод void reserve(size_type Count = 0 );
который резервирует память заранее, т.е. при добавлении символов не будет происходит перераспределения памяти (пока конечно изначально зарезервированный буфер не исчерпается).

HTH
AIDS
Re[2]: Нужен совет
От: AlexTAI alextai.narod.ru
Дата: 19.08.02 05:26
Оценка:
Здравствуйте 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 )
alextai3@yahoo.com
Re[3]: Нужен совет
От: Кодт Россия  
Дата: 19.08.02 10:19
Оценка: 6 (1)
Здравствуйте AlexTAI, Вы писали:

ATAI>есть 2 основных требования:

ATAI>1. все работает с юникодом.
ATAI>2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".

Уже есть std::wstring — для юникода
namespace std {
typedef basic_string<wchar_t> wstring;
}


Если операций склейки много, а результат многокилобайтный, то можно еще использовать список строк
using namespace std;

class wstrlist
{
protected:
  typedef list<std::wstring> list_t;

  list_t m_list;

public:
  void operator +=(const std::wstring& s)
  {
    if(s.empty()) return;
    if(!m_list.empty() && m_list.back().size() + s.size() < 1024)
      m_list.back() += s; // добавление к имеющейся строке более осмысленно
    else
      m_list.push_back(s); // добавим новую строку
  }

  void export(owstream& os) const
  {
    list_t::const_iterator it = m_list.begin(), itEnd = m_list.end();
    while(it != itEnd) os << *it;
  }

  operator wstring() const
  {
    owstrstream os;
    export(os);
    return os.str();
  }

  friend owstream& operator << (owstream& os, const wstrlist& sl)
  {
    sl.export(os);
    return os;
  }
};
Перекуём баги на фичи!
Re[4]: Нужен совет
От: AlexTAI alextai.narod.ru
Дата: 19.08.02 10:56
Оценка:
Здравствуйте Кодт, Вы писали:

К>Здравствуйте AlexTAI, Вы писали:


ATAI>>есть 2 основных требования:

ATAI>>1. все работает с юникодом.
ATAI>>2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".

К>Уже есть std::wstring — для юникода

К>
К>namespace std {
К>typedef basic_string<wchar_t> wstring;
К>}
К>


К>Если операций склейки много, а результат многокилобайтный, то можно еще использовать список строк

К>
К>using namespace std;

К>class wstrlist
К>{
К>protected:
К>  typedef list<std::wstring> list_t;

К>  list_t m_list;

К>public:
К>  void operator +=(const std::wstring& s)
К>  {
К>    if(s.empty()) return;
К>    if(!m_list.empty() && m_list.back().size() + s.size() < 1024)
К>      m_list.back() += s; // добавление к имеющейся строке более осмысленно
К>    else
К>      m_list.push_back(s); // добавим новую строку
К>  }

К>  void export(owstream& os) const
К>  {
К>    list_t::const_iterator it = m_list.begin(), itEnd = m_list.end();
К>    while(it != itEnd) os << *it;
К>  }

К>  operator wstring() const
К>  {
К>    owstrstream os;
К>    export(os);
К>    return os.str();
К>  }

К>  friend owstream& operator << (owstream& os, const wstrlist& sl)
К>  {
К>    sl.export(os);
К>    return os;
К>  }
К>};

К>






Большое спасибо.
Тогда еще один маленький вопрос — как перекопировать полученный список в wchar_t * Буффер поэффективнее.
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re[5]: Нужен совет
От: Кодт Россия  
Дата: 19.08.02 11:05
Оценка: 6 (1)
Здравствуйте 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;
  }

};

Другую функциональность (копирование, очистку и т.д.) можно прикрутить по мере нужды.
Перекуём баги на фичи!
Re[6]: Нужен совет
От: AlexTAI alextai.narod.ru
Дата: 19.08.02 11:25
Оценка:
Здравствуйте Кодт, Вы писали:

К>Здравствуйте 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 )
alextai3@yahoo.com
Re[3]: Нужен совет
От: Mozhay Россия www.mozhay.chat.ru
Дата: 19.08.02 11:40
Оценка:
Здравствуйте AlexTAI, Вы писали:
ATAI>стоит проверки-хотя не уверен что он подойдет.
ATAI>есть 2 основных требования:
ATAI>1. все работает с юникодом.
ATAI>2. при перераспределении памяти желательно чтобы перераспределение происходило с "запасом на будующее".

1. Можно использовать std::wstring
2. В VC 6.0 по умолчанию string и wstring увеличиваются в размере при необходимости сразу на 32 символа (или больше). Можно более эффективно сделать это с помощью reserve().
Re: Нужен совет
От: WolfHound  
Дата: 19.08.02 16:01
Оценка:
Здравствуйте AlexTAI, Вы писали:

ATAI>Задача следующая:

ATAI>Строится HTML. При этом есть море операций прибавления нового текста к уже существующему (обычно кусочки по 10-20 байт). Есть ли какой нибудь стандартный класс который ваполнял бы эту задачу эффективно?
ATAI>Например выделяя большой буффер и работая с ним — что привело бы к уменьшению перевыделений и операций копирования — или что то в этом роде. Или придется изобретать велосипед заново? (что крайне в лом...). Желательно MFC не предлагать.

ATAI>Спасибо заранее.


А может этот
Автор: WolfHound
Дата: 19.08.02
темплейт поможет?
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.