С++ задачи и вопросы
565 subscribers
533 photos
4 files
200 links
Задачи, тесты и теоретические вопросы по С++

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
⚙️ std::unordered_map

В C++ std::unordered_map из заголовка представляет собой хэш-таблицу, которая обеспечивает быстрый доступ к элементам по ключу. В отличие от std::map, элементы хранятся в произвольном порядке, а операции поиска выполняются за O(1) в среднем случае.

👩‍💻

@quizcpp
Вопрос на собеседовании

Что такое pimpl idiom в C++ и когда его использовать?

Ответ ⬇️
Pimpl idiom (Pointer to Implementation) — это паттерн, который скрывает реализацию класса за указателем на скрытый тип в заголовочном файле. Это улучшает инкапсуляцию, минимизирует зависимости и ускоряет компиляцию.

Пример использования ⚙️
// MyClass.h
#include

class MyClassImpl; // Forward declaration

class MyClass {
public:
MyClass();
void someFunction();

private:
std::unique_ptr pImpl; // Указатель на скрытую реализацию
};

// MyClass.cpp
#include "MyClass.h"
#include

class MyClassImpl {
public:
void someFunctionImpl() { std::cout someFunctionImpl(); }

// main.cpp
#include "MyClass.h"

int main() {
MyClass obj;
obj.someFunction();
return 0;
}

В этом примере pimpl idiom скрывает реализацию MyClassImpl, что позволяет изменять реализацию без изменения публичного интерфейса, улучшая инкапсуляцию и ускоряя компиляцию.

👩‍💻

@quizcpp
⚙️ std::any_cast()

Метод std::any_cast() используется для извлечения значения из объекта типа std::any. Этот тип может содержать значение любого типа, и std::any_cast позволяет безопасно получить его, если тип извлекаемого значения совпадает с типом, указанным в аргументе.

👩‍💻

@quizcpp
⚙️ std::filesystem::create_directory

Метод std::filesystem::create_directory из заголовка используется для создания новой директории. Это полезно для программ, которые работают с файловыми структурами и должны создавать папки динамически.

👩‍💻

@quizcpp
🤔 Как это работает? — Передача аргументов в C++

В C++ аргументы функции можно передавать по значению, по ссылке и по константной ссылке. Эти подходы влияют на производительность и безопасность. Давайте разберём, как это работает.

➡️ Как это работает:

• Передача по значению: создаёт копию объекта, что может быть дорого для больших объектов.
• Передача по ссылке: передаёт ссылку на объект, избегая копирования.
• Передача по константной ссылке: добавляет защиту от изменения объекта внутри функции.

Развернутый аналог:
void modifyValue(const int &value) {
// value нельзя изменить
}

👩‍💻

@quizcpp
🔥1
⚙️ std::ofstream

std::ofstream из заголовка используется для записи данных в файл. Это удобный инструмент для работы с файлами, позволяющий записывать текстовую или бинарную информацию.

👩‍💻

@quizcpp
⚙️ std::byte

std::byte из заголовка предоставляет тип для работы с данными на уровне байтов. Это полезно для низкоуровневой работы с памятью и сетевыми протоколами.

👩‍💻

@quizcpp
Вопрос на собеседовании

Как работает std::atomic в C++, и в чём его преимущество перед обычными переменными в многопоточном программировании?

Ответ ⬇️
std::atomic — это шаблонный класс из библиотеки , который предоставляет атомарные операции с переменными, гарантируя их безопасность в многопоточной среде. Используя атомарные операции, вы избегаете гонок данных без необходимости явно использовать мьютексы.

Пример использования ⚙️
#include
#include
#include

std::atomic counter(0);

void increment() {
for (int i = 0; i < 1000; ++i) {
counter.fetch_add(1);
}
}

int main() {
std::thread t1(increment);
std::thread t2(increment);

t1.join();
t2.join();

std::cout

@quizcpp
Вопрос на собеседовании

Как работает std::atomic в C++, и в чём его преимущество перед обычными переменными в многопоточном программировании?

Ответ ⬇️
std::atomic — это шаблонный класс из библиотеки , который предоставляет атомарные операции с переменными, гарантируя их безопасность в многопоточной среде. Используя атомарные операции, вы избегаете гонок данных без необходимости явно использовать мьютексы.

Пример использования ⚙️
#include
#include
#include

std::atomic counter(0);

void increment() {
for (int i = 0; i < 1000; ++i) {
counter.fetch_add(1);
}
}

int main() {
std::thread t1(increment);
std::thread t2(increment);

t1.join();
t2.join();

std::cout

@quizcpp
🚫 Антипаттерн недели: Использование явных циклов для поиска в контейнерах

Явные циклы для поиска элемента в контейнерах делают код громоздким и увеличивают вероятность ошибок. В C++ стандартная библиотека предоставляет функции, такие как std::find, для упрощения и оптимизации этих операций.

✔️ Используйте алгоритмы из , такие как std::find, чтобы упростить код и улучшить читаемость.

👩‍💻

@quizcpp
Вопрос на собеседовании

Что такое std::allocator в C++, и как его можно использовать для управления памятью?

Ответ ⬇️
std::allocator — это стандартный шаблонный класс, предоставляющий низкоуровневые инструменты для управления памятью в STL-контейнерах. Он позволяет настраивать аллокацию памяти, предоставляя методы для выделения, освобождения и построения объектов.

Пример использования ⚙️
#include
#include

int main() {
std::allocator allocator;

// Выделяем память для 3 целых чисел
int* arr = allocator.allocate(3);

// Конструируем элементы
allocator.construct(arr, 10);
allocator.construct(arr + 1, 20);
allocator.construct(arr + 2, 30);

// Выводим значения
for (int i = 0; i < 3; ++i) {
std::cout

@quizcpp
⚙️ std::atomic_flag

std::atomic_flag из заголовка представляет собой простой атомарный флаг, который можно использовать для реализации низкоуровневой синхронизации.

👩‍💻

@quizcpp
Вопрос на собеседовании

Что такое constexpr в C++ и в чём его отличие от const?

Ответ ⬇️
constexpr — это спецификатор в C++, который указывает, что значение выражения или функции может быть вычислено на этапе компиляции, если это возможно. В отличие от const, который просто запрещает изменение значения, constexpr гарантирует, что вычисления происходят на этапе компиляции (при условии, что все входные данные известны на этом этапе).

constexpr используется для оптимизации кода, особенно в вычислениях, которые можно заранее предсказать.

Пример использования ⚙️
#include

constexpr int square(int x) {
return x * x; // Вычисляется на этапе компиляции
}

int main() {
constexpr int result = square(5); // Результат вычислен на этапе компиляции
std::cout

@quizcpp