C/C++ | Вопросы собесов
前往频道在 Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
显示更多4 179
订阅者
-324 小时
-27 天
-1230 天
数据加载中...
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
八月 '26
八月 '26
+30
在0个频道中
七月 '26
+54
在0个频道中
Get PRO
六月 '26
+46
在1个频道中
Get PRO
五月 '26
+54
在0个频道中
Get PRO
四月 '26
+43
在0个频道中
Get PRO
三月 '26
+58
在0个频道中
Get PRO
二月 '26
+69
在0个频道中
Get PRO
一月 '26
+84
在0个频道中
Get PRO
十二月 '25
+42
在0个频道中
Get PRO
十一月 '25
+100
在0个频道中
Get PRO
十月 '25
+54
在0个频道中
Get PRO
九月 '25
+47
在0个频道中
Get PRO
八月 '25
+77
在0个频道中
Get PRO
七月 '25
+72
在0个频道中
Get PRO
六月 '25
+83
在0个频道中
Get PRO
五月 '25
+83
在0个频道中
Get PRO
四月 '25
+99
在3个频道中
Get PRO
三月 '25
+88
在2个频道中
Get PRO
二月 '25
+187
在3个频道中
Get PRO
一月 '25
+129
在53个频道中
Get PRO
十二月 '24
+148
在0个频道中
Get PRO
十一月 '24
+123
在0个频道中
Get PRO
十月 '24
+448
在43个频道中
Get PRO
九月 '24
+643
在252个频道中
Get PRO
八月 '24
+127
在0个频道中
Get PRO
七月 '24
+191
在54个频道中
Get PRO
六月 '24
+1 110
在244个频道中
Get PRO
五月 '24
+1 483
在192个频道中
Get PRO
四月 '24
+706
在22个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 26 八月 | +2 | |||
| 25 八月 | 0 | |||
| 24 八月 | +3 | |||
| 23 八月 | 0 | |||
| 22 八月 | +2 | |||
| 21 八月 | 0 | |||
| 20 八月 | 0 | |||
| 19 八月 | +1 | |||
| 18 八月 | +1 | |||
| 17 八月 | +2 | |||
| 16 八月 | 0 | |||
| 15 八月 | 0 | |||
| 14 八月 | +4 | |||
| 13 八月 | +1 | |||
| 12 八月 | +2 | |||
| 11 八月 | 0 | |||
| 10 八月 | +1 | |||
| 09 八月 | +2 | |||
| 08 八月 | +2 | |||
| 07 八月 | 0 | |||
| 06 八月 | +1 | |||
| 05 八月 | 0 | |||
| 04 八月 | +2 | |||
| 03 八月 | 0 | |||
| 02 八月 | +2 | |||
| 01 八月 | +2 |
频道帖子
🤔 Какой имеется побочный эффект при работе с кодом в хидере?
При работе с кодом в хидерах возможны проблемы, связанные с повторным включением файлов (multiple inclusion), что может вызвать ошибки компиляции. Это решается использованием включающих защит (#pragma once или #ifndef). Также код в хидере увеличивает время компиляции, так как включается в несколько исходных файлов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знаний
| 2 | Квартиры Петербург Колпино Семейная Ипотека 3,5%
Жилой комплекс "Квартал Заречье"
Санкт-Петербург. Колпино.
4 девятиэтажных жилых корпуса
8-этажный крытый гараж на 496 парковочных мест
В живописном месте у реки Ижора.
На первых этажах будут размещены магазины, кофейни, поликлиника и зона коворкинга.
Перейти на сайт
Изучите все условия кредита (займа) на сайте в соответствующем разделе. Оценивайте свои финансовые возможности и риски. Финансовые услуги оказывает: ПАО «Сбербанк». Проектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО «СЗ «ЗАГОРОДНАЯ, 71».
#реклама
квартал-заречье.рф
О рекламодателе | 273 |
| 3 | 🤔 Почему со стеком работать быстрее чем с кучей?
🟠Управление памятью
Стек: Память в стеке управляется автоматически. Когда вызывается функция, память для её локальных переменных выделяется одним блоком при входе в функцию и освобождается при выходе из неё. Эта операция выполняется за постоянное время (O(1)).
Куча: Память в куче управляется вручную (программистом) или через автоматическое управление памятью (например, сборщик мусора). Выделение и освобождение памяти в куче требуют поиска подходящего блока памяти, что может занимать больше времени (O(log n) или даже O(n)).
🟠Локальность данных
Стек: Данные в стеке расположены компактно и последовательно. Это означает, что доступ к данным будет быстрее из-за лучшего использования кэш-памяти процессора.
Куча: Данные в куче могут быть фрагментированы, что приводит к меньшей эффективности кэширования и увеличению времени доступа.
🟠Предсказуемость
Стек: Память в стеке выделяется и освобождается в строго определённом порядке (LIFO - Last In, First Out). Это делает операции со стеком предсказуемыми и упрощает управление памятью.
Куча: Память в куче может выделяться и освобождаться в произвольном порядке, что приводит к фрагментации и усложняет управление памятью.
🟠Минимизация накладных расходов
Стек: Операции выделения и освобождения памяти на стеке имеют минимальные накладные расходы, так как это просто смещение указателя стека.
Куча: Операции выделения и освобождения памяти в куче требуют более сложных алгоритмов и могут включать в себя дополнительные накладные расходы, такие как управление списками свободных блоков и слияние фрагментов.
#include <iostream>
void stackFunction() {
int stackArray[1000]; // Массив на стеке
// Работа с массивом
}
void heapFunction() {
int* heapArray = new int[1000]; // Массив в куче
// Работа с массивом
delete[] heapArray; // Освобождение памяти
}
int main() {
stackFunction(); // Быстрая работа со стеком
heapFunction(); // Медленная работа с кучей
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний | 267 |
| 4 | Аренда VPS/VDS-сервера.
Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес.
Преимущества аренды:
- Выделенные ресурсы без переплаты;
- KVM-виртуализация;
- Быстрые NVMe SSD;
- Бесплатная защита от DDoS;
- Управление через панель, API и Terraform;
- Техподдержка 24/7.
Запустите сервер за несколько минут!
Попробовать
#реклама 16+
selectel.ru
О рекламодателе | 304 |
| 5 | Пожизненный PRO доступ на easyoffer — по цене одного года!
До 2 сентября вы можете купить PRO навсегда.
Покупаешь один раз — пользуешься всю жизнь.
– База вопросов и задач из собеседований
– Примеры видео-ответов на вопросы
– Записи реальных собеседований
– Тренажеры "Проработка вопросов" и "Реальное собеседование"
– Аналитика требований из вакансий
– Автоотклики на вакансии
– Агрегатор вакансий (скоро)
👉 Купить PRO со скидкой 70%: https://easyoffer.ru/pro | 295 |
| 6 | 🤔 Сколько занимает места объект пустого класса?
Объект пустого класса не может иметь нулевой размер из-за требований стандарта. Поэтому компилятор добавляет "фиктивный байт" (dummy byte), чтобы каждый объект имел уникальный адрес.
Простой пример
#include <iostream>
class Empty {};
int main() {
std::cout << "Размер пустого класса: " << sizeof(Empty) << " байт\n";
return 0;
}
Вывод (на большинстве компиляторов):
Размер пустого класса: 1 байт
Что если создать массив пустых объектов?
#include <iostream>
class Empty {};
int main() {
Empty arr[10]; // Создаем массив из 10 объектов
std::cout << "Размер массива из 10 пустых объектов: " << sizeof(arr) << " байт\n";
return 0;
}
Вывод
Размер массива из 10 пустых объектов: 10 байт
🟠Унаследованный пустой класс (Empty Base Optimization - EBO)
Если пустой класс используется в наследовании, компилятор может убрать его размер (оптимизация Empty Base Optimization, EBO).
#include <iostream>
class Empty {};
class Derived : public Empty {
int value; // 4 байта (обычно)
};
int main() {
std::cout << "Размер пустого класса: " << sizeof(Empty) << " байт\n";
std::cout << "Размер наследника: " << sizeof(Derived) << " байт\n";
return 0;
}
Вывод
Размер пустого класса: 1 байт
Размер наследника: 4 байта (а не 5!)
Ставь 👍 и забирай 📚 Базу знаний | 314 |
| 7 | Решайте задачи и готовьтесь к техсекции на стажировку
А ты сможешь решить алгоритмическую задачу за час и без подсказок?
Яндекс проводит бесплатные тренировки по алгоритмам для тех, кто хочет систематизировать знания, прокачать решение задач и подготовиться к техническому собеседованию.
-Короткие видеоуроки
-Практические задачи
-Регулярные соревнования
-Решение задач на время
-Рейтинг и награды
-Возможность получить сертификат
Мы тренируем не только знание алгоритмов, но и умение применять их тогда, когда рядом нет подсказок.
Проверь свои алгоритмические навыки и прокачай слабые места.
Регистрируйся на бесплатные тренировки!
Записаться онлайн
#реклама 16+
yandex.ru
О рекламодателе | 320 |
| 8 | 🤔 Как устроена хеш таблица в unordered_map?
std::unordered_map в C++ реализован на основе хеш-таблицы. Это структура данных, обеспечивающая O(1) доступ к элементам в среднем случае.
🚩Основные компоненты хеш-таблицы
🟠Массив "бакетов" (buckets)
Хеш-таблица состоит из массива бакетов, где каждый бакет содержит список элементов с одинаковым хеш-кодом.
🟠Функция хеширования (`std::hash<T>`)
Для определения, в какой бакет попадёт ключ, используется функция хеширования (std::hash<T>).
🟠Проверка коллизий
Если два разных ключа попадают в один бакет (коллизия), элементы сохраняются в связанном списке (чаще всего).
🟠Рехеширование
При переполнении таблицы (load_factor > порогового значения) количество бакетов увеличивается, и все элементы перераспределяются.
🚩Как работает поиск и вставка в `unordered_map`
Хеш-функция вычисляет хеш-код ключа
std::hash<int> hash_fn;
size_t hash_value = hash_fn(42); // Например, 23145123
Определяется индекс бакета
size_t bucket_index = hash_value % bucket_count;
🚩Разрешение коллизий
Когда два ключа попадают в один бакет, возникают коллизии. std::unordered_map использует метод цепочек (separate chaining):
В каждом бакете хранится связанный список (или другой контейнер).
Если несколько элементов имеют одинаковый хеш, они добавляются в этот список.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> myMap;
myMap[1] = "One"; // Хеш-функция определит бакет
myMap[2] = "Two"; // Если попадает в тот же бакет, создаётся список
for (const auto& [key, value] : myMap) {
std::cout << "Key: " << key << ", Value: " << value << '\n';
}
return 0;
}
🚩Рехеширование (увеличение количества бакетов)
Когда таблица заполняется, выполняется rehash (увеличение массива бакетов в 2 раза).
Load factor (load_factor()) показывает, насколько заполнена таблица:
std::unordered_map<int, std::string> myMap;
std::cout << "Load factor: " << myMap.load_factor() << '\n';
Ставь 👍 и забирай 📚 Базу знаний | 332 |
| 9 | Регистрируйтесь на Yandex Scale 2026
Главная конференция Yandex Cloud.
Узнайте о сервисах, которые меняют ваш бизнес.
4 офлайн-трека (AI, Infra + DevTools, Data, Security), онлайн-трек Deep Tech, воркшопы по ИИ и интерактивы. Подробнее о программе читайте в карточках🗒
📅24 сентября
🚗Москва + 💻онлайн
Участие бесплатное!
Зарегистрироваться
#реклама 16+
scale.yandex.cloud
О рекламодателе | 332 |
| 10 | 🤔 Что знаешь про гарантии безопасности исключений?
Гарантии безопасности исключений (Exception Safety Guarantees) — это концепция, связанная с корректным поведением программы при возникновении исключений. Она определяет, насколько безопасно может завершиться выполнение функции или блока кода в случае выбрасывания исключения.
🚩Никаких гарантий (No Guarantee)
Этот уровень означает, что при возникновении исключения состояние программы может быть непредсказуемым. Объекты могут остаться в недопустимом состоянии, и поведение программы после выброса исключения неопределено.
void unsafeFunction(std::vector<int>& vec, int value) {
vec.push_back(value); // Если здесь выбросится исключение, состояние vec не определено
// ...
}
🚩Базовая гарантия (Basic Guarantee)
Этот уровень гарантирует, что не произойдёт утечек ресурсов или нарушений инвариантов объектов. После выброса исключения все объекты остаются в допустимом состоянии, однако состояние программы может быть частично изменено.
void safeFunction(std::vector<int>& vec, int value) {
try {
vec.push_back(value); // Если исключение, состояние vec остаётся корректным
} catch (...) {
// Обработка исключения
std::cerr << "Ошибка при добавлении элемента!" << std::endl;
}
}
🚩Сильная гарантия (Strong Guarantee)
Этот уровень гарантирует, что в случае возникновения исключения программа останется в исходном состоянии, как будто вызов функции никогда не происходил. Состояние откатывается до того, что было до вызова функции.
void addValue(std::vector<int>& vec, int value) {
std::vector<int> temp = vec; // Создаём копию
temp.push_back(value); // Работаем с копией
vec = temp; // Замена содержимого
}
🚩Гарантия отсутствия исключений (No-Throw Guarantee)
Этот уровень гарантирует, что функция никогда не выбрасывает исключений. Обычно применяется к ключевым операциям (например, деструкторам, перемещениям).
void safeSwap(std::vector<int>& a, std::vector<int>& b) noexcept {
a.swap(b); // std::vector::swap гарантирует отсутствие исключений
}
🚩Как достигаются гарантии безопасности исключений?
🟠RAII (Resource Acquisition Is Initialization)
Использование классов, где ресурсы освобождаются в деструкторах. Например, std::unique_ptr или std::lock_guard.
🟠Копирование перед изменением
Применение принципа работы с временными копиями (как в примере сильной гарантии).
🟠Использование стандартных контейнеров
Библиотека STL предоставляет базовую гарантию безопасности исключений для большинства операций.
Ставь 👍 и забирай 📚 Базу знаний | 329 |
| 11 | 🤔 Когда нужно объявлять деструктор виртуальным?
Виртуальный деструктор нужен всегда, когда класс предполагается использовать в качестве базового и поддерживает полиморфизм (наследование и динамическое связывание).
🚩Зачем нужен виртуальный деструктор?
Если у базового класса деструктор не виртуальный, а удаление происходит через указатель на базовый класс, деструктор производного класса не вызовется! Это приведёт к утечке памяти или некорректному освобождению ресурсов.
Пример проблемы без виртуального деструктора
#include <iostream>
class Base {
public:
~Base() { std::cout << "Деструктор Base\n"; } // НЕ виртуальный!
};
class Derived : public Base {
public:
~Derived() { std::cout << "Деструктор Derived\n"; }
};
int main() {
Base* obj = new Derived();
delete obj; // Проблема! Деструктор Derived НЕ вызывается!
}
Вывод
Деструктор Base
🚩Решение: сделать деструктор виртуальным
Если объявить деструктор базового класса виртуальным (virtual), то при удалении через указатель на базовый класс будет вызван полный цепной деструктор. Используем virtual
class Base {
public:
virtual ~Base() { std::cout << "Деструктор Base\n"; } // Виртуальный!
};
class Derived : public Base {
public:
~Derived() { std::cout << "Деструктор Derived\n"; }
};
int main() {
Base* obj = new Derived();
delete obj; // Теперь вызываются оба деструктора
}
Вывод
Деструктор Derived
Деструктор Base
🚩Когда не нужно делать деструктор виртуальным?
Когда класс не предназначен для наследования
Например, std::vector, std::string, std::unique_ptr – у них нет виртуального деструктора, так как они не предполагают полиморфное использование
Когда удаление всегда происходит по ссылке/указателю на сам класс, а не на базовый
Derived* obj = new Derived();
delete obj; // В любом случае вызовет правильный деструктор
Если класс "заморожен" (final)
class FinalClass final {
public:
~FinalClass() { std::cout << "Деструктор\n"; }
};
Ставь 👍 и забирай 📚 Базу знаний | 334 |
| 12 | 🤔 Что такое deque?
Deque (double-ended queue, двусторонняя очередь) — это последовательный контейнер в C++, который позволяет добавлять и удалять элементы как с начала, так и с конца очереди с постоянной временной сложностью O(1). Контейнер deque является частью стандартной библиотеки шаблонов (STL) и объявляется в заголовочном файле <deque>.
🚩Основные характеристики:
🟠Быстрый доступ к элементам:
deque обеспечивает доступ к элементам по индексу с амортизированной временной сложностью O(1).
🟠Двусторонняя очередь:
Позволяет эффективно добавлять и удалять элементы как с начала, так и с конца очереди.
🟠Динамический размер:
deque автоматически изменяет свой размер по мере добавления или удаления элементов, подобно vector.
🟠Не требует смежного хранения:
В отличие от vector, элементы deque могут быть размещены в различных сегментах памяти, что делает его более гибким для частых операций вставки и удаления.
🚩Основные операции:
🟠Добавление элементов:
push_back(), push_front()
🟠Удаление элементов:
pop_back(), pop_front()
🟠Доступ к элементам:
operator[], at(), front(), back()
🟠Размер и емкость:
size(), empty(), resize()
🟠Итераторы:
Поддержка итераторов для прохода по элементам
#include <iostream>
#include <deque>
int main() {
std::deque<int> dq;
// Добавление элементов в конец
dq.push_back(1);
dq.push_back(2);
dq.push_back(3);
// Добавление элементов в начало
dq.push_front(0);
std::cout << "Deque elements: ";
for (int elem : dq) {
std::cout << elem << " ";
}
std::cout << std::endl;
// Удаление элемента с конца
dq.pop_back();
// Удаление элемента с начала
dq.pop_front();
std::cout << "Deque elements after pop operations: ";
for (int elem : dq) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний | 390 |
| 13 | 🤔 Что такое наследование?
Наследование — это механизм ООП, позволяющий одному классу (наследнику) унаследовать свойства и методы другого класса (родителя) для повторного использования и расширения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знаний | 445 |
| 14 | 🤔 Что такое placement new?
placement new – это специальная форма оператора new, которая размещает объект в уже выделенной памяти вместо того, чтобы выделять её заново.
placement new
НЕ выделяет память (мы сами передаём адрес).
Просто вызывает конструктор в указанном месте.
void* ptr = malloc(sizeof(int)); // Выделяем память вручную
int* num = new(ptr) int(42); // Размещаем объект в этой памяти
Синтаксис placement new
new (адрес) Type(аргументы конструктора);
адрес – указатель на уже выделенную память.
Type(аргументы конструктора) – объект создаётся в этом месте.
#include <iostream>
int main() {
char buffer[sizeof(int)]; // Буфер памяти (размер как у int)
int* p = new (buffer) int(123); // Размещаем int в этом буфере
std::cout << "Значение: " << *p << std::endl; // 123
}
🚩Когда используется `placement new`?
🟠Оптимизация выделения памяти
Например, если у нас часто создаются и удаляются объекты, но память уже есть. Не нужно каждый раз вызывать new и delete.
🟠Размещение объектов в особых областях памяти
Например, на стеке (char buffer[100]), в shared memory, или в выделенной заранее области (malloc).
🟠Создание объекта в заранее выделенном массиве
Стандартный std::vector использует placement new внутри себя!
🟠Кастомные аллокаторы (`std::allocator`)
Например, в играх и в embedded-разработке, где управление памятью критично.
🚩`placement new` и классы
Если объект – это класс, placement new вызывает его конструктор в выделенной памяти.
#include <iostream>
#include <cstdlib> // Для malloc/free
class MyClass {
public:
int x;
MyClass(int val) : x(val) { std::cout << "Конструктор!\n"; }
~MyClass() { std::cout << "Деструктор!\n"; }
};
int main() {
void* buffer = malloc(sizeof(MyClass)); // Выделяем сырую память
MyClass* obj = new (buffer) MyClass(42); // Размещаем объект
std::cout << "Значение: " << obj->x << std::endl;
obj->~MyClass(); // Ручной вызов деструктора!
free(buffer); // Освобождаем память
}
Вывод
Конструктор!
Значение: 42
Деструктор!
🚩Ошибки при `placement new`
Забыл вызвать деструктор
MyClass* obj = new (buffer) MyClass(10);
// delete obj; // НЕЛЬЗЯ! Обычный `delete` не работает
free(buffer); // Память утекла! Деструктор не вызвался
Нужно вызвать вручную
obj->~MyClass();
free(buffer);
placement new в одном буфере несколько раз (без очистки)*
void* buffer = malloc(sizeof(MyClass));
MyClass* obj1 = new (buffer) MyClass(1);
MyClass* obj2 = new (buffer) MyClass(2); // Перезапишет obj1!
Нужно сначала вызвать деструктор
obj1->~MyClass();
MyClass* obj2 = new (buffer) MyClass(2);
Освободил память перед вызовом деструктора
free(buffer); // Память освободили
obj->~MyClass(); // ОШИБКА! Память уже не существует
Правильный порядок
obj->~MyClass();
free(buffer);
Ставь 👍 и забирай 📚 Базу знаний | 468 |
| 15 | Не знак свыше, а точный таргетинг
Теперь всем, кто продвигается через CTV в Яндекс Директе, стало проще находить свою аудиторию.
Таргетингов стало в 5 раз больше. Вот что нового:
— Таргетинг по интересам. Например, можно выбрать не всех, кто интересуется спортом, а только любителей фитнеса или тенниса.
— Таргетинг по привычкам. Находите аудиторию по поведению в онлайне и офлайне — например, тех, кто регулярно посещает торговые центры или часто покупает товары в интернете.
— Более гибкие настройки. Можно сочетать интересы и социально-демографические характеристики с жанрами и тематиками контента.
👌 Используйте новые возможности, чтобы сделать рекламу на Connected TV еще эффективнее
Узнать больше
#реклама
yandex.ru
О рекламодателе | 316 |
| 16 | 🤔 Какие виды конструкторов могут быть у класса?
🟠Конструктор по умолчанию (Default Constructor)
Без параметров, создается автоматически компилятором, если не задан.
class MyClass {
public:
MyClass() {}
};
🟠Параметризованный конструктор (Parameterized Constructor)
Принимает параметры для инициализации объекта.
class MyClass {
private:
int x;
public:
MyClass(int value) : x(value) {}
};
🟠Конструктор копирования (Copy Constructor)
Создает копию существующего объекта.
class MyClass {
private:
int x;
public:
MyClass(const MyClass &other) : x(other.x) {}
};
🟠Конструктор перемещения (Move Constructor)
Перемещает ресурсы из временного объекта.
class MyClass {
private:
int* data;
public:
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr;
}
};
🟠Делегирующий конструктор (Delegating Constructor)
Вызывает другой конструктор того же класса.
class MyClass {
private:
int x, y;
public:
MyClass(int value) : MyClass(value, 0) {}
MyClass(int value1, int value2) : x(value1), y(value2) {}
};
🟠Явный конструктор (Explicit Constructor)
Помечен explicit для предотвращения неявных преобразований.
class MyClass {
public:
explicit MyClass(int value) {}
};
Ставь 👍 и забирай 📚 Базу знаний | 424 |
| 17 | Gurufy
📚 Gurufy — ИИ-сервис, который собирает персональный курс под вашу задачу: план из глав, статьи с иллюстрациями и интерактивными виджетами, задания и ИИ-ассистент прямо в главе.
✨ Простой вопрос быстрее задать ChatGPT. Но когда на тему нужен день и больше, одним чатом её не закрыть: нет плана, нет визуализаций, нет заданий — всё тонет в одной переписке.
🎓 Готовый курс — десятки тысяч рублей против 500–1000 ₽.
⚡ Попробуйте сами. Старт бесплатный.
Узнать больше
#реклама 16+
gurufy.ru
О рекламодателе | 329 |
| 18 | 🤔 В каких STL контейнерах внутри находится хеш таблица?
🚩В стандартной библиотеке шаблонов (STL) C++ хеш-таблица используется для реализации следующих контейнеров
🟠std::unordered_map
Ассоциативный контейнер, который хранит пары ключ-значение, с уникальными ключами. Обеспечивает амортизированное среднее время доступа, вставки и удаления за O(1).
🟠std::unordered_multimap
Ассоциативный контейнер, который хранит пары ключ-значение, где ключи могут повторяться. Обеспечивает амортизированное среднее время для основных операций за O(1), несмотря на дублирование ключей.
🟠std::unordered_set
Ассоциативный контейнер, который хранит уникальные элементы, неупорядоченные. Обеспечивает амортизированное среднее время для основных операций за O(1).
🟠std::unordered_multiset
Ассоциативный контейнер, который хранит элементы, где значения могут повторяться, неупорядоченные. Обеспечивает амортизированное среднее время для основных операций за O(1), несмотря на дублирование элементов.
Ставь 👍 и забирай 📚 Базу знаний | 426 |
| 19 | Дачная дача в Т-Банк Шопе
Футболки с огурцами, тыквами, капустой и другие крутые штуки, да еще и с финансовыми пожеланиями. Надо брать.
Посмотреть каталог
#реклама
tbank.ru
О рекламодателе | 342 |
| 20 | 🤔 Как работает range based?
Range-based for loop – это упрощённый цикл for, который позволяет перебирать элементы контейнера (std::vector, std::array, std::map, std::set и т. д.) без индексов и итераторов.
for (auto element : container) {
// Действие с element
}
🚩Как это работает внутри?
Простой пример с std::vector
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
for (int x : v) { // Перебираем все элементы вектора
std::cout << x << " ";
}
}
Вывод
1 2 3 4 5
Как работает этот цикл?
Компилятор превращает его в обычный for с итератором:
for (auto it = v.begin(); it != v.end(); ++it) {
int x = *it; // Копируем элемент
std::cout << x << " ";
}
🚩Передача по ссылке (`&`) и по значению (`=`)
Передача по значению (=) – создаёт копию элемента
for (int x : v) { // x - копия элемента
x = 100; // НЕ изменит вектор!
}
Передача по ссылке (&) – изменяет оригинал
for (int& x : v) { // x - ссылка на элемент
x *= 2; // Изменит оригинальный вектор!
}
🚩Работает со всеми контейнерами STL
С std::map
std::map<int, std::string> m = {{1, "one"}, {2, "two"}};
for (const auto& [key, value] : m) { // structured binding (C++17)
std::cout << key << " -> " << value << "\n";
}
С std::set
std::set<int> s = {1, 2, 3, 4};
for (int x : s) { std::cout << x << " "; }
🚩Работает с `std::initializer_list`
for (int x : {10, 20, 30}) {
std::cout << x << " ";
}
Вывод
10 20 30
🚩Как работает range-based for с обычными массивами?
int arr[] = {1, 2, 3};
for (int x : arr) { std::cout << x << " "; }
Работает так же, как и с `std::vector`!
Работает с пользовательскими классами (если есть begin() и end())
class MyContainer {
int data[3] = {10, 20, 30};
public:
int* begin() { return data; }
int* end() { return data + 3; }
};
int main() {
MyContainer c;
for (int x : c) { std::cout << x << " "; }
}
Ставь 👍 и забирай 📚 Базу знаний | 426 |
