| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Быстрое удаление класса из std::list |
| Автор: GKosh 29.5.2008, 10:13 |
| День добрый! До сих пор удалял объекты из std::list<MyClass*> путем перебора списка. В реализации видно, что список двусторонний, то есть перебор по идее не требуется. Достаточно иметь указатель на объект списка. Насколько я понял, функцию этих указателей для пользователя в std::list играют иттераторы. Вопрос, можно ли вставить в класс, хранящийся в списке иттератор списка, чтобы сразу вызывать erase по этому иттератору, без необходимости перебирать? Проверил бы опытным путем, но сильно поджимает время. Если кто-то в курсе, буду очень признателен. |
| Автор: Alek86 29.5.2008, 10:30 |
| да можно, если MyClass будет содержать std::list<Class*>::iterator в качестве поля но для автоматизаци лучше сделать свой список (наследник std::list или включающий его), который при вставке будет сам заполнять это поле класса MyClass. |
| Автор: GKosh 29.5.2008, 11:06 |
| Спасибо! это хорошая новость |
| Автор: Lazin 29.5.2008, 11:44 | ||||
это не очень хорошо, во первых кто-нибудь из вашей команды может не подумать о факте наличия итератора в объекте класса и написать код - удаляющий элементы контейнера, но не изменяющий сам объект, во вторых такой объект не сможет использоваться без контейнера, итератор которого он содержит, ну еще есть небольшой оверхэд на хранение итератора решения: можно использовать boost::intrusive, класс будет содержать в себе все необходимое, что-бы быть элементом контейнера, это сэкономит память, так-же будет меньше уровень косвенности при обращении к объекту, как следствие - выше производительность можно передать в объект класса функтор для финализации
|
| Автор: Lazin 29.5.2008, 12:02 | ||
я про этот случай и говорил |
| Автор: Alek86 29.5.2008, 12:10 |
так что же в нем плохого? Добавлено через 1 минуту и 54 секунды а, ну да для использования этого механизма нужно-таки открыть MyList::MyElement закрыть нужно итератор MyList::MyElement::m_ref |