Интрузивные списки
Я не смог найти слишком много информации о них в Интернете. Что они и когда они обычно используются?
Спасибо.
Ответы
Ответ 1
Интрузивный список - это тот, где указатель на следующий список node хранится в той же структуре, что и данные node. Обычно это "Плохая вещь", поскольку она связывает данные с конкретной реализацией списка. Большинство библиотек классов (например, стандартная библиотека С++) используют неинтрузивные списки, где данные ничего не знают о реализации списка (или другого контейнера).
Ответ 2
Мне действительно нравится интрузивная модель
- Лучше по памяти (не так много небольших ассигнований для вещей
указать на другие вещи)
- Это позволяет вам иметь объект, который
существуют в нескольких контейнерах.
- Он позволяет вам найти элемент с одним режимом поиска (хэш), но
затем найдите следующий элемент в лексикографическом порядке (это не то же, что и # 2, но
это может быть также выполнено boost
multi_index_container, но обратите внимание, что у multi_index_container есть определенные недостатки, которые не являются проблемами с интрузивным)
Интрузивный ХОРОШИЙ
Вам просто нужно знать, что вы делаете (что верно для любого контейнера)
Ответ 3
Списки интрузий - это списки, в которых сами объекты являются головками или ячейками списков. Это хорошие или плохие вещи в зависимости от контекста.
Внутри некоторого определенного модуля (небезопасная группа классов, работающих вместе) это может быть ЛУЧШЕЕ среднее для установления связей между классами. Они разрешают беззатратное прямое и полное управление общими отношениями, такими как unicity (например: яблоки не повторяют два раза в яблочных словах, и для этого не нужен какой-либо ключ, а яблоки не принадлежат к двум отдельным деревьям), они являются судоходными в обоих направлениях (прямые access к appletree с учетом яблока и яблок с некоторыми яблоко). Все основные операции: O (1) (нет поиска в каком-либо внешнем контейнере).
Интрузивный список ОЧЕНЬ ПЛОХО между двумя модулями. Поскольку они будут связаны друг с другом, а обоснование модулей - это управление независимостью кода.
Ответ 4
Ниже приведено краткое описание, которое также подходит для списков:
I. Интрузивные контейнеры.
Объект, который нужно сохранить, содержит дополнительную информацию, позволяющую интегрировать в контейнер. Пример:
struct Node
{
Node* next; // additional
Node* prev; // information
T data;
}
1. Плюсы:
-
- хранит сами объекты.
- не требует управления памятью.
- Итерация выполняется быстрее.
- лучшие гарантии исключений.
- предсказуемость при вставке и удалении объектов. (не требуется дополнительное (не предсказуемое) управление памятью.)
- улучшенная локальность памяти.
2. Минусы:
-
- содержит дополнительные данные для интеграции контейнеров. (каждый тип магазина должен быть адаптирован (изменен) к требованиям контейнера.)
- Предостережение с возможными побочными эффектами при изменении содержимого хранимого объекта (особенно для ассоциативных контейнеров).
- управление жизненным циклом вставленного объекта, независимо от контейнера.
- объект может быть удален до удаления из контейнера, ведущего к недействительности итератора.
- интрузивные контейнеры не копируются и не могут быть назначены.
II. Неинструзионные контейнеры (стандартные контейнеры С++)
Объект не "знает" и содержит сведения о контейнере, в котором должен храниться. Пример:
struct Node
{
T data;
}
1. Плюсы:
-
- не содержит дополнительной информации о интеграции контейнера.
- срок службы объекта, управляемый контейнером. (менее сложный.)
2. Минусы:
-
- хранить копии значений, переданных пользователем. (возможно строительство на месте.)
- объект может принадлежать только одному контейнеру. (или contaier должен хранить указатели на объекты.)
- накладные расходы при хранении копий. (бухгалтерия по каждому размещению.)
-
не скопируемые или не движимые объекты НЕ МОГУТ быть сохранены в неинтрузивных контейнерах. - не может хранить производный объект и сохранять прежний тип. (разрезание - теряет полиморфизм.)