---
title: Контейнеры
seo:
  title: Контейнеры — C++ Developer
  description: "Тема «Контейнеры» для собеседования C++ Developer. Расскажите о контейнерах стандартной библиотеки vector, list, map, unordered_map. Какая разница между std::set, std::map, std::unordered_multimap?"
---

[Все темы C++ Developer](/c-developer)

## <strong>Расскажите о контейнерах стандартной библиотеки</strong> <code>vector</code><strong>,</strong> <code>list</code><strong>,</strong> <code>map</code><strong>,</strong> <code>unordered_map</code> [#q-14bee738d69b818e8ca7c4592dd36aff]

<strong>Контейнеры стандартной библиотеки C++&#58;</strong>

{/* prettier-ignore */}
1. <code>std&#58;&#58;vector</code>&#58;

    - <strong>Тип</strong>&#58; Динамический массив.

    - <strong>Особенности</strong>&#58; Быстрый доступ по индексу (<code>O&#40;1&#41;</code>), эффективное добавление элементов в конец.

    - <strong>Использование</strong>&#58; Подходит для случаев, когда требуется быстрый случайный доступ и частое добавление элементов в конец.

    ```cpp
    std::vector<int> vec = {1, 2, 3};
    ```

1. <code>std&#58;&#58;list</code>&#58;

    - <strong>Тип</strong>&#58; Двусвязный список.

    - Вставка одного элемента и удаление элемента по уже известному итератору занимают O(1). Поиск нужной позиции требует обхода и может стоить O(n); оператора индексного доступа у std&#58;&#58;list нет.

    - <strong>Использование</strong>&#58; Подходит для случаев, когда важны операции вставки и удаления.

    ```cpp
    std::list<int> lst = {1, 2, 3};
    ```

1. <code>std&#58;&#58;map</code>&#58;

    - <strong>Тип</strong>&#58; Отсортированный ассоциативный контейнер.

    - <strong>Особенности</strong>&#58; Хранит пары "ключ-значение" в отсортированном порядке, доступ к элементам и операции вставки/удаления имеют сложность <code>O&#40;log n&#41;</code>.

    - <strong>Использование</strong>&#58; Подходит для случаев, когда важен порядок и требуется быстрый поиск по ключу.

    ```cpp
    std::map<int, std::string> mp = {{1, "one"}, {2, "two"}};
    ```

1. <code>std&#58;&#58;unordered&#95;map</code>&#58;

    - <strong>Тип</strong>&#58; Неотсортированный ассоциативный контейнер (хеш-таблица).

    - Поиск одного ключа в std&#58;&#58;unordered\_map имеет среднюю сложность O(1), в худшем случае O(n). Для вставки и удаления по ключу также важны коллизии и возможное расширение; среднюю оценку нельзя выдавать за гарантию худшего случая.

    - <strong>Использование</strong>&#58; Подходит для случаев, когда важна скорость поиска, но не важен порядок элементов.

    ```cpp
    std::unordered_map<int, std::string> ump = {{1, "one"}, {2, "two"}};
    ```

:::note[Ссылки для изучения]

1. [Типы контейнеров в C++](https://metanit.com/cpp/tutorial/7.1.php)
   :::

---

## <strong>Какая разница между</strong> <code>std&#58;&#58;set</code><strong>,</strong> <code>std&#58;&#58;map</code><strong>,</strong> <code>std&#58;&#58;unordered_multimap</code><strong>?</strong> [#q-14bee738d69b811688d4ef86b08b71f0]

<strong>Разница между</strong> <code>std&#58;&#58;set</code>
<strong>,</strong> <code>std&#58;&#58;map</code>
<strong>,</strong> <code>std&#58;&#58;unordered&#95;multimap</code>
<strong>&#58;</strong>

{/* prettier-ignore */}
1. <code>std&#58;&#58;set</code>&#58;

    - <strong>Тип</strong>&#58; Отсортированный контейнер.

    - <strong>Хранение</strong>&#58; Хранит уникальные элементы в отсортированном порядке.

    - <strong>Доступ</strong>&#58; Быстрый поиск, добавление и удаление (<code>O&#40;log n&#41;</code>).

    - <strong>Использование</strong>&#58; Подходит для хранения уникальных элементов, когда важен порядок.

    ```cpp
    std::set<int> s = {1, 2, 3};
    ```

1. <code>std&#58;&#58;map</code>&#58;

    - <strong>Тип</strong>&#58; Отсортированный ассоциативный контейнер.

    - <strong>Хранение</strong>&#58; Хранит пары "ключ-значение" в отсортированном порядке по ключу.

    - <strong>Доступ</strong>&#58; Быстрый поиск, добавление и удаление по ключу (<code>O&#40;log n&#41;</code>).

    - <strong>Использование</strong>&#58; Подходит для хранения пар "ключ-значение", когда важен порядок и уникальность ключей.

    ```cpp
    std::map<int, std::string> m = {{1, "one"}, {2, "two"}};
    ```

1. <code>std&#58;&#58;unordered&#95;multimap</code>&#58;

    - <strong>Тип</strong>&#58; Неотсортированный ассоциативный контейнер (хеш-таблица).

    - <strong>Хранение</strong>&#58; Хранит пары "ключ-значение" без определённого порядка. Позволяет дублирование ключей.

    - Поиск имеет среднюю сложность O(1), в худшем случае O(n). Получение или удаление всех элементов с данным ключом зависит также от числа совпадений; erase(key) не имеет безусловной оценки O(1).

    - <strong>Использование</strong>&#58; Подходит для хранения пар "ключ-значение" с дублирующимися ключами, когда важна скорость поиска, но не важен порядок.

    ```cpp
    std::unordered_multimap<int, std::string> ump = {{1, "one"}, {2, "two"}, {1, "uno"}};
    ```

:::note[Ссылки для изучения]

1. [Типы контейнеров в C++](https://metanit.com/cpp/tutorial/7.1.php)
   :::

---

## <strong>В чем разница между</strong> <code>vector</code> <strong>и</strong> <code>list</code> <strong>и в каких случаях их лучше использовать?</strong> [#q-14bee738d69b8196a683dc34a81ed2a9]

<strong>Главные отичия между</strong> <code>vector</code> <strong>и</strong>
<code>list</code>
<strong>&#58;</strong>

#### <code>std&#58;&#58;vector</code>&#58;

- <strong>Тип</strong>&#58; Динамический массив.

- <strong>Хранение</strong>&#58; Элементы хранятся в непрерывной области памяти.

- <strong>Доступ</strong>&#58; Быстрый доступ по индексу (
  <code>O&#40;1&#41;</code>).

- <strong>Операции</strong>&#58; Эффективное добавление элементов в конец, но
  медленное удаление/вставка в середине или начале (<code>O&#40;n&#41;</code>).

- <strong>Использование</strong>&#58; Подходит для случаев, когда требуется
  быстрый случайный доступ и добавление элементов в конец.

  ```cpp
  std::vector<int> vec = {1, 2, 3};
  ```

#### <code>std&#58;&#58;list</code>&#58;

- <strong>Тип</strong>&#58; Двусвязный список.

- <strong>Хранение</strong>&#58; Элементы хранятся не в непрерывной области
  памяти, а связаны указателями.

- <strong>Доступ</strong>&#58; Медленный доступ по индексу (
  <code>O&#40;n&#41;</code>).

- Вставка одного элемента и удаление элемента по уже известному итератору занимают O(1). Поиск нужной позиции требует обхода и может стоить O(n); оператора индексного доступа у std&#58;&#58;list нет.

- <strong>Использование</strong>&#58; Подходит для случаев, когда важны операции
  вставки и удаления в середине или начале, а доступ по индексу не является
  критичным.

  ```cpp
  std::list<int> lst = {1, 2, 3};
  ```

#### Когда использовать&#58;

- <code>std&#58;&#58;vector</code>&#58; Когда требуется быстрый случайный доступ
  и частое добавление элементов в конец.

- <code>std&#58;&#58;list</code>&#58; Когда важны операции вставки и удаления в
  любом месте, а неэффективный доступ по индексу не является проблемой.

:::note[Ссылки для изучения]

1. [Типы контейнеров в C++](https://metanit.com/cpp/tutorial/7.1.php)
   :::

---

## Чем отличаются std&#58;&#58;map и std&#58;&#58;unordered_map? [#q-14bee738d69b81db878be680d9836437]

В стандартной библиотеке есть std&#58;&#58;map и std&#58;&#58;unordered_map; типа std&#58;&#58;hashmap нет. Их различия&#58;

#### <code>std&#58;&#58;map</code>&#58;

- <strong>Тип</strong>&#58; Отсортированный ассоциативный контейнер.

- <strong>Хранение</strong>&#58; Хранит пары "ключ-значение" в отсортированном
  порядке по ключу.

- <strong>Доступ</strong>&#58; Быстрый поиск, добавление и удаление по ключу (
  <code>O&#40;log n&#41;</code>), благодаря реализации на основе
  сбалансированного бинарного дерева.

- <strong>Использование</strong>&#58; Подходит для случаев, когда важен порядок
  ключей или требуется последовательный доступ.

  ```cpp
  std::map<int, std::string> m = {{1, "one"}, {2, "two"}};
  ```

#### <code>std&#58;&#58;unordered_map</code>&#58;

- <strong>Тип</strong>&#58; Неотсортированный ассоциативный контейнер
  (хеш-таблица).

- <strong>Хранение</strong>&#58; Хранит пары "ключ-значение" без определённого
  порядка.

- Поиск одного ключа в std&#58;&#58;unordered_map имеет среднюю сложность O(1), в худшем случае O(n). Для вставки и удаления по ключу также важны коллизии и возможное расширение; среднюю оценку нельзя выдавать за гарантию худшего случая.

- <strong>Использование</strong>&#58; Подходит для случаев, когда порядок ключей
  не важен, а важна максимальная скорость доступа.

  ```cpp
  std::unordered_map<int, std::string> um = {{1, "one"}, {2, "two"}};
  ```

#### Основные различия&#58;

- <strong>Порядок элементов</strong>&#58; <code>std&#58;&#58;map</code> хранит
  элементы в отсортированном порядке,
  <code>std&#58;&#58;unordered&#95;map</code> - в произвольном порядке.

- Поиск одного ключа в std&#58;&#58;unordered_map имеет среднюю сложность O(1), в худшем случае O(n). Для вставки и удаления по ключу также важны коллизии и возможное расширение; среднюю оценку нельзя выдавать за гарантию худшего случая.

- <strong>Использование памяти</strong>&#58;
  <code>std&#58;&#58;unordered&#95;map</code> обычно требует больше памяти из-за
  хеш-таблицы.

:::note[Ссылки для изучения]

1. [Типы контейнеров в C++](https://metanit.com/cpp/tutorial/7.1.php)
   :::
