# 03 Лекция, intrusive контейнеры
(10.09.2022)
> [TOC]
## Зачем
В современном прграммировании доминирующие структуры данных - Вектора и Хеш-таблицы, про двухсвязные списки все забыли, но если мы посмотрим на ядро линукса, например, там доминирующая структура как раз списки, почему?
Допустим нам нужно хранить много обьектов в памяти:
* Список - без доступа к случайному элементу, разбросан по памяти
* Вектор - сложности с удалением, нужно найти сначала
* Хэш таблицы - ОК (но дорого)
В старкрафте все юниты храняться в двухсвязном списке
[Статья](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbG9MSGl6Tzl0cGktUWJSTTM0dTQ5czAwVGFNd3xBQ3Jtc0ttMzhYZVBRRGVwTFVkT1lQMFkzaWVYMURJTkIzeC1oZzh6WE9mbnM0S0pVcEZWNHlDTG56bnBuZHhNVjdPSTkxTWN1MzNhcExNR1dJX2EwOWVRbVBhcGx0SGozS0E1YzFrQk8zY1lWUzBEZHlDSzg4Yw&q=https%3A%2F%2Fwww.codeofhonor.com%2Fblog%2Ftough-times-on-the-road-to-starcraft&v=arcYfeOe1_0)
```cpp
struct Unit
{
Unit *prev;
Unit *next;
//...
Unit *selected_prev; // для не select не испол
Unit *selectrd_next;
//...
};
```

Пример узла LRU кэша
```cpp
struct Node
{
Value value;
Key key;
// ordered by key
Node *parent; // Можно как дерево
Node *left;
Node *right;
// oredered by access time
Node *next; // Можно как список
Node *prev;
};
```
Можно выделить общий код:
C-style
```c
struct List_element
{
List_element *prev;
List_element *next;
};
struct Unit
{
List_element all_units_node;
//...
List_element selected_node;
//...
};
```