У меня есть класс, который выглядит так:
typedef std::list<char*> PtrList;
class Foo
{
public:
void DoStuff();
private:
PtrList m_list;
PtrList::iterator m_it;
};
Функция DoStuff()
в основном добавляет элементы в m_list
или стирает из нее элементы, находит итератор в каком-то специальном элементе в нем и сохраняет его в m_it
. Важно отметить, что каждое значение m_it
используется при каждом следующем вызове DoStuff()
.
Итак, в чем проблема?
Все работает, за исключением того, что профилирование показывает, что оператор new
вызван слишком сильно из-за list::push_back()
, вызванного из DoStuff()
.
Чтобы увеличить производительность, я хочу предварительно выделить память для m_list
в инициализации Foo
, как я бы сделал, если бы это был std::vector
. Проблема в том, что это приведет к появлению новых проблем, таких как:
- Менее эффективные элементы
insert
иerase
. -
m_it
становится недействительным, как только вектор изменяется с одного вызова наDoStuff()
на следующий. EDIT: Алан Стокс предложил использовать индекс вместо итератора, решая эту проблему.
Мое решение: Самое простое решение, о котором я подумал, - это реализовать пул объектов, который также имеет функциональность связанного списка. Таким образом, я получаю связанный список и могу выделить память для него.
Я что-то упустил или это действительно самое простое решение? Я бы предпочел не "изобретать колесо" и вместо этого использовать стандартное решение, если оно существует.
Любые мысли, обходные пути или просветляющие комментарии будут оценены!