![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
GKosh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
День добрый!
До сих пор удалял объекты из std::list<MyClass*> путем перебора списка. В реализации видно, что список двусторонний, то есть перебор по идее не требуется. Достаточно иметь указатель на объект списка. Насколько я понял, функцию этих указателей для пользователя в std::list играют иттераторы. Вопрос, можно ли вставить в класс, хранящийся в списке иттератор списка, чтобы сразу вызывать erase по этому иттератору, без необходимости перебирать? Проверил бы опытным путем, но сильно поджимает время. Если кто-то в курсе, буду очень признателен. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
да можно, если MyClass будет содержать std::list<Class*>::iterator в качестве поля
но для автоматизаци лучше сделать свой список (наследник std::list или включающий его), который при вставке будет сам заполнять это поле класса MyClass. |
|||
|
||||
GKosh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
Спасибо! это хорошая новость
![]() |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
это не очень хорошо, во первых кто-нибудь из вашей команды может не подумать о факте наличия итератора в объекте класса и написать код - удаляющий элементы контейнера, но не изменяющий сам объект, во вторых такой объект не сможет использоваться без контейнера, итератор которого он содержит, ну еще есть небольшой оверхэд на хранение итератора решения: можно использовать boost::intrusive, класс будет содержать в себе все необходимое, что-бы быть элементом контейнера, это сэкономит память, так-же будет меньше уровень косвенности при обращении к объекту, как следствие - выше производительность можно передать в объект класса функтор для финализации
|
||||
|
|||||
Alek86 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
поскольку это list, то ничего страшного не произойдет если удаляешь какой-то элемент, то остальные трогать не надо (все итераторы остаются валидными) а единственный, который надо - это тот, который только что удалил ![]() само собой и потому я и говорил про спец класс - он в себе будет хранить подкласс-элемент типа такого:
комментить лень было, но, надеюсь, суть ясна Это сообщение отредактировал(а) Alek86 - 29.5.2008, 11:59 |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
так что же в нем плохого? Добавлено через 1 минуту и 54 секунды а, ну да для использования этого механизма нужно-таки открыть MyList::MyElement закрыть нужно итератор MyList::MyElement::m_ref |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |