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

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

Что такое шаблонный метод std::enable_if в C++, как он работает, и в каких случаях его полезно использовать?

Ответ ⬇️
std::enable_if — это шаблонный механизм SFINAE (Substitution Failure Is Not An Error), позволяющий включать или отключать функции или классы на этапе компиляции в зависимости от выполнения условий. Это полезно для создания перегрузок шаблонов или ограничения их использования для определённых типов.

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

// Шаблон для целых чисел
template
typename std::enable_if::type
printType(T value) {
std::cout

@quizcpp
⚙️ std::bind

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

👩‍💻

@quizcpp
⚙️ std::accumulate

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

👩‍💻

@quizcpp
⚙️ std::partition

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

👩‍💻

@quizcpp
🔥1
⚙️ std::partial_sort

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

👩‍💻

@quizcpp
⚙️ std::merge

В C++ функция std::merge из заголовка объединяет два отсортированных диапазона в один отсортированный. Это полезно для слияния данных из двух контейнеров.

👩‍💻

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

Что такое emplace в C++ и чем оно отличается от push_back при работе с контейнерами STL?

Ответ ⬇️
Метод emplace добавляет новый элемент в контейнер, создавая его непосредственно на месте, вместо создания временного объекта и его копирования (как в случае с push_back). Это повышает производительность, особенно при добавлении сложных объектов. Метод emplace вызывает конструктор объекта с переданными аргументами прямо в памяти контейнера.

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

class MyClass {
public:
MyClass(const std::string& name, int value) : name(name), value(value) {
std::cout

@quizcpp
⚙️ std::remove_if

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

👩‍💻

@quizcpp
👩‍💻 Задача по C++: Подсчёт слов в строке

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

Пример:

#include
#include

int main() {
std::string text1 = "Hello world!";
std::string text2 = " Multiple spaces between words ";

std::cout

@quizcpp
⚙️ std::generate_n

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

👩‍💻

@quizcpp
⚙️ std::find

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

👩‍💻

@quizcpp
⚙️ std::clamp

В C++17 и выше функция std::clamp из заголовка ограничивает значение заданным диапазоном. Это удобно для нормализации данных или защиты от выхода за пределы диапазона.

👩‍💻

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

Что такое умные указатели в C++ (std::unique_ptr, std::shared_ptr, std::weak_ptr), и чем они отличаются друг от друга?

Ответ ⬇️
Умные указатели в C++ автоматизируют управление памятью и помогают избежать утечек памяти. Они находятся в заголовке .

std::unique_ptr владеет ресурсом единолично. При уничтожении указателя ресурс освобождается.
std::shared_ptr позволяет нескольким указателям совместно владеть ресурсом. Ресурс освобождается, когда последний shared_ptr уничтожается.
std::weak_ptr предоставляет доступ к ресурсу, но не увеличивает счётчик ссылок. Используется для предотвращения циклических зависимостей.

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

int main() {
// unique_ptr: единоличное владение
std::unique_ptr uptr = std::make_unique(10);
std::cout

@quizcpp
⚙️ std::minmax_element()

Функция std::minmax_element() из находит минимальный и максимальный элементы в одном проходе. Это эффективнее, чем отдельные вызовы std::min_element() и std::max_element().

👩‍💻

@quizcpp
⚙️ std::ranges::for_each

В C++20 функция std::ranges::for_each из заголовка позволяет применять заданную функцию к элементам диапазона с учётом новой концепции Range-based. Это упрощает работу с контейнерами и итераторами.

👩‍💻

@quizcpp
⚙️ std::chrono

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

👩‍💻

@quizcpp
🔥1
🤔 Как это работает? — C++: Умные указатели std::shared_ptr

В C++ умные указатели помогают управлять памятью автоматически. Давайте разберёмся, как работает std::shared_ptr.

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

• std::shared_ptr ptr1 создаёт умный указатель ptr1, который владеет объектом MyClass.
• ptr2 = ptr1 делает ptr2 ещё одним владельцем того же объекта.
• ptr1.use_count() возвращает количество умных указателей, владеющих объектом.

Когда последний std::shared_ptr перестанет существовать, объект будет автоматически удалён.

👩‍💻

@quizcpp
Антипаттерн недели: Утечка памяти из-за забытых delete

Забыть освободить выделенную память с помощью delete может привести к утечке памяти (memory leak).

Каждый вызов new должен сопровождаться вызовом delete или delete[]. В противном случае выделенная память остаётся занята до завершения программы.

✔️ Как исправить:

Используйте умные указатели (std::unique_ptr или std::shared_ptr), чтобы автоматически управлять памятью. Если используете new, не забудьте вызвать delete.
#include
#include

void createArray() {
auto arr = std::make_unique(5);
arr[0] = 42;
std::cout

@quizcpp
⚙️ 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