![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Superklug |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Доброго времени суток!
Необходимо написать класс-контейнер который позволяет получать доступ как по ключу (как std::map), так и по индексу (как std::vector). Начал разбираться с boost::multi_index... Написал примерно следующее:
Однако возникли сложности с реализацией методов, которые возвращают ссылки на элементы контейнера (не константные). Т.е. такой код работает:
А вот такой нет:
Вычитал, что изменять значения multi_index позволяют методы replace и modify, но в моем случае они не помогут( Подскажите как быть в этой ситуации? Отказаться от multi_index и делать средствами stl или есть все таки способ? Заранее спасибо! |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Нету, даже средствами stl. Возврат не-константной ссылки подразумевает возможность модификации объекта, по этой ссылке. Если этот объект входит в один или более индексов multi_index, то после такой модификации все затронутые индексы должны быть автоматически пересчитанны, что практически нереализуемо в рамках стандартных контейнеров stl
|
|||
|
||||
| Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Ну с помощью stl можно хранить множество (std::set) элементов и вектор (std::vector) указателей на эти элементы...
Просто это будет не так красиво как с использованием multi_index. Я думаю из приведенного кода задача ясна.. Есть класс Value (фактически Variant) который может хранить объекты определенных типов (включая Object). Как бы вы реализовали класс Object? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| Superklug |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Не получается(
Если пытаюсь по имени получить из multi_index итератор, то он возвращает его как const iterator. В итоге пришел к тому с чего начал... Может я не так вас понял? Можете набросать небольшой пример? Спасибо! |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Я имел в виду хранить в multi_index_container вместе с ключем уникальный идентификатор (целое число), и по нему извлекать данные из другого контейнера. Сам идентификатор создается один раз (при создании элемента) и в дальнейшем не меняется.
Что использовать в качестве 2го контейнера зависит от того, насколько часто будут удаляться элементы. Если не часто (или вообще не будут), то использовать vector (в этом случае идентификатором будет индекс). Иначе использовать map, у которого в качестве ключа используется этот же идентификатор (на этот раз просто значение счетчика, который увеличивается на 1 при каждом создании элемента) |
|||
|
||||
| Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Спасибо!
Теперь все понятно. Жалко только, что решение вышло не такое элегантное, как виделось в начале) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |